OpenGL-Textur wird schwarz angezeigtC++

Programme in C++. Entwicklerforum
Anonymous
 OpenGL-Textur wird schwarz angezeigt

Post by Anonymous »

Ich verwende OpenGL mit GLFW, GLEW und GLM.
Ich versuche, Pixel zu einer Textur zu zeichnen und diese dann als Vollbild-Quad auf dem Bildschirm anzuzeigen. Allerdings wird die Textur immer schwarz angezeigt und ich bin mir nicht sicher, wo ich einen Fehler gemacht habe.
Hier wird die Textur initialisiert (sowie das Vollbild-Quad):

Code: Select all

int InitializeRenderTarget(GameManager* gameManager)
{
// Vertex Array Object
GLuint vertexArrayID;
glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);

programID = LoadShaders("Source/Graphics/SimpleVertexShader.vert", "Source/Graphics/RenderTextureFragmentShader.frag");

// The texture we're going to render to
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
gameManager->GRID_SIZE, gameManager->GRID_SIZE,
0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glGenerateMipmap(GL_TEXTURE_2D);

// The fullscreen quad's FBO
static const GLfloat g_quad_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f, //0.0f, 0.0f,
1.0f, -1.0f, 0.0f, //1.0f, 0.0f,
-1.0f,  1.0f, 0.0f, //0.0f, 1.0f,
-1.0f,  1.0f, 0.0f, //0.0f, 1.0f,
1.0f, -1.0f, 0.0f, //1.0f, 0.0f,
1.0f,  1.0f, 0.0f, //1.0f, 1.0f
};

glGenBuffers(1, &quad_vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW);

texID = glGetUniformLocation(programID, "renderedTexture");

glEnable(GL_TEXTURE_2D);

return 0;
}
Hier auf die Textur zeichnen:

Code: Select all

void RenderToTexture(GameManager* gameManager)
{
glBindTexture(GL_TEXTURE_2D, renderedTexture);

float* particleColors = gameManager->getParticleColors();
glTexSubImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
gameManager->GRID_SIZE, gameManager->GRID_SIZE,
0, GL_RGB, GL_FLOAT, (GLvoid*)particleColors);
glGenerateMipmap(GL_TEXTURE_2D);

// Poor filtering
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
Zeichnung hier auf dem Bildschirm:

Code: Select all

void RenderToScreen()
{
// Render to the screen
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Render on the whole framebuffer, complete from the lower left corner to the upper right
glViewport(100, 100, screenWidth-200, screenHeight-200);

// Clear the screen
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Use our shader
glUseProgram(programID);

// Bind our texture in Texture Unit 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
// Set our "renderedTexture" sampler to use Texture Unit 0
glUniform1i(texID, 0);

// 1rst attribute buffer : vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
glVertexAttribPointer(
0,                  // attribute 0.  No particular reason for 0, but must match the layout in the shader.
3,                  // size
GL_FLOAT,           // type
GL_FALSE,           // normalized?
0,  // stride
(void*)0            // array buffer offset
);

// Draw the triangles !
glDrawArrays(GL_TRIANGLES, 0, 6); // 2*3 indices starting at 0 -> 2 triangles

glDisableVertexAttribArray(0);

// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();
}
Die Hauptschleife:

Code: Select all

int main(void)
{
if (InitializeWindow() != 0) {
fprintf(stderr, "Failed to open GLFW window.\n");
getchar();
glfwTerminate();
return -1;
}

GameManager* gameManager = gameManager->getInstance();

if (InitializeRenderTarget(gameManager) != 0) {
fprintf(stderr, "Failed to initialize render target.\n");
getchar();
glfwTerminate();
return -1;
}

do {
gameManager->Update();
RenderToTexture(gameManager);
RenderToScreen();
} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0);

CleanUp();

return 0;
}
Vertex-Shader:

Code: Select all

#version 460 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;

// Output data ; will be interpolated for each fragment.
out vec2 UV;

void main(){
gl_Position =  vec4(vertexPosition_modelspace, 1);
UV = (vertexPosition_modelspace.xy+vec2(1,1))/2.0;
}
und schließlich Fragment-Shader:

Code: Select all

#version 460 core

in vec2 UV;

out vec4 color;

uniform sampler2D renderedTexture;

void main(){
color = texture(renderedTexture, UV);
//color = vec4(UV.x, UV.y, 0, 1);
}
Ich bin mir ziemlich sicher, dass ich das Quad richtig auf dem Bildschirm zeichne, da ich die auskommentierte Linie im Fragment-Shader verwendet habe, um einen schönen Farbverlaufseffekt zu erzeugen.
Allerdings binde ich die Textur möglicherweise nicht richtig.
Ich habe bestätigt, dass das Array „particleColors“ tatsächlich Gleitkommawerte korrekt enthält. Ich habe versucht, alle Rottöne auf 1.0f und alle Werte auf 1.0f sowie alle Werte auf 255.0f zu setzen (nur für den Fall).
Ich habe versucht, Zeilen wie diese hinzuzufügen:

Code: Select all

glEnable(GL_TEXTURE_2D);

glGenerateMipmap(GL_TEXTURE_2D);

// Poor filtering
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
basierend auf einigen anderen Beiträgen, die ich gesehen habe, aber ich habe noch keinen sichtbaren Effekt gesehen.
Ich habe auch versucht, die Art und Weise zu ändern, wie der Vertex- und Fragment-Shader die UVs berechnet und verwendet, aber das hat die Sache nur noch schlimmer gemacht, da der Verlaufseffekt zu diesem Zeitpunkt noch nicht einmal angezeigt wurde.
Was habe ich verpasst?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post