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):
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();
}
#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;
}
#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:
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?
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]int InitializeRenderTarget(GameManager* gameManager) { // Vertex Array Object GLuint vertexArrayID; glGenVertexArrays(1, &vertexArrayID); glBindVertexArray(vertexArrayID);
return 0; } [/code] Hier auf die Textur zeichnen: [code]void RenderToTexture(GameManager* gameManager) { glBindTexture(GL_TEXTURE_2D, renderedTexture);
// 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); } [/code] Zeichnung hier auf dem Bildschirm: [code]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);
// 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(); } [/code] Die Hauptschleife: [code]int main(void) { if (InitializeWindow() != 0) { fprintf(stderr, "Failed to open GLFW window.\n"); getchar(); glfwTerminate(); return -1; }
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);
// 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; } [/code] und schließlich Fragment-Shader: [code]#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); } [/code] 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]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); [/code] 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?
Als ich QT verwendete, habe ich einen Unschärfeneffekt auf ein Qwidget angewendet, das ein Fenster ist. Der Code sieht so aus:
#include
#include
#include
int main(int argc, char** argv) {...
Als ich QT verwendete, habe ich einen Unschärfeneffekt auf ein Qwidget angewendet, das ein Fenster ist. Der Code sieht so aus:
#include
#include
#include
int main(int argc, char** argv) {...
Als ich QT verwendete, habe ich einen Unschärfeneffekt auf ein Qwidget angewendet, das ein Fenster ist. Der Code sieht so aus:
#include
#include
#include
int main(int argc, char** argv) {...
Als ich QT verwendete, habe ich einen Unschärfeneffekt auf ein Qwidget angewendet, das ein Fenster ist. Der Code sieht so aus:
#include
#include
#include
int main(int argc, char** argv) {...
Ich habe versucht, eine Schattenkarte zu implementieren, aber die gesamte Szene ist schwarz, obwohl sie definitiv nicht sein sollte.
Ich initialisiere ein Licht bei (4, 1, 4) mit Richtung (0, 0, 0)....