Я использую OpenGL с GLFW, GLEW и GLM.
Я пытаюсь нарисовать пиксели на текстуре, а затем отобразить ее на экране в виде полноэкранного четырехэкранного изображения. Однако текстура всегда отображается черной, и я не уверен, где я ошибся.
Инициализация текстуры здесь (а также полноэкранного четырехэкранного режима):
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);
}
Я совершенно уверен, что правильно рисую четырехугольник на экране, поскольку использовал закомментированную строку во фрагментном шейдере, чтобы создать красивый эффект красочного градиента.
Однако я, возможно, неправильно привязываю текстуру.
Я подтвердил, что массив частиц действительно правильно содержит значения с плавающей запятой. Я попробовал установить для всех красных цветов значение 1.0f, для всех значений — 1.0f, а также для всех значений — 255.0f (на всякий случай).
Я попробовал добавить такие строки:
на основе некоторых других сообщений, которые я видел, но пока не увидел какого-либо видимого эффекта.
Я также пытался изменить способ расчета вершинного и фрагментного шейдера и использовать UV, но это только ухудшило ситуацию, поскольку эффект градиента даже не появился в этот момент.
Что я пропустил?>
Я использую OpenGL с GLFW, GLEW и GLM. Я пытаюсь нарисовать пиксели на текстуре, а затем отобразить ее на экране в виде полноэкранного четырехэкранного изображения. Однако текстура всегда отображается черной, и я не уверен, где я ошибся. Инициализация текстуры здесь (а также полноэкранного четырехэкранного режима): [code]int InitializeRenderTarget(GameManager* gameManager) { // Vertex Array Object GLuint vertexArrayID; glGenVertexArrays(1, &vertexArrayID); glBindVertexArray(vertexArrayID);
// 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] Рисование на экране здесь: [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] Основной цикл: [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] и, наконец, фрагментный шейдер: [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] Я совершенно уверен, что правильно рисую четырехугольник на экране, поскольку использовал закомментированную строку во фрагментном шейдере, чтобы создать красивый эффект красочного градиента. Однако я, возможно, неправильно привязываю текстуру. Я подтвердил, что массив частиц действительно правильно содержит значения с плавающей запятой. Я попробовал установить для всех красных цветов значение 1.0f, для всех значений — 1.0f, а также для всех значений — 255.0f (на всякий случай). Я попробовал добавить такие строки: [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] на основе некоторых других сообщений, которые я видел, но пока не увидел какого-либо видимого эффекта. Я также пытался изменить способ расчета вершинного и фрагментного шейдера и использовать UV, но это только ухудшило ситуацию, поскольку эффект градиента даже не появился в этот момент. Что я пропустил?>