我在将opengl渲染到帧缓冲区对象时遇到了一个问题,在不绑定fbo的情况下,渲染代码中的所有内容都可以很好地工作,但是一旦绑定fbo,结果就是黑色。着色器正常工作,我已经检查了多次,因此希望有人可以在这里帮助我。提前致谢! :)
屏幕着色器代码:
/// Vertex
#version 330 core
layout (location = 0) in vec2 aPos;
layout (location = 1) in vec2 aTexCoords;
out vec2 TexCoords;
void
main(void)
{
gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0);
TexCoords = aTexCoords;
}
/// Fragment
#version 330 core
out vec4 FragColor;
in vec2 TexCoords;
uniform sampler2D main_texture;
void
main(void)
{
FragColor = texture(main_texture, TexCoords);
}
RENDERER RenderSprite代码:
void
RenderSprite(Renderer *renderer,
Texture *texture,
vec2 position, f32 rotation, vec2 scale,
vec2 origin, vec4 colour)
{
UseShader(renderer->shader);
mat4 model = GLM_MAT4_IDENTITY_INIT;
vec3 rot_mult = { 0.0f, 0.0f, 1.0f };
vec3 origin_offset = { (origin[0]+1) * scale[0], (origin[1]) * scale[1], 0.0f };
vec3 inv_origin_offset = { -origin_offset[0], -origin_offset[1], 0.0f };
glm_translate(model, inv_origin_offset);
vec3 position_offset = { position[0], position[1], 0.0f };
glm_translate(model, position_offset);
glm_translate(model, origin_offset);
glm_rotate(model, rotation * DEG2RAD, rot_mult);
glm_translate(model, inv_origin_offset);
vec3 scale_vec3 = { texture->width * scale[0], texture->height * scale[1], 1.0f };
glm_scale(model, scale_vec3);
/*************************************************************************/
SetShaderMat4f(renderer->shader, "model", model);
SetShaderVec4f_arr(renderer->shader, "tint", colour);
glActiveTexture(GL_TEXTURE0);
BindTexture(texture);
glBindVertexArray(texture->vao);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
}
QUAD VAO初始代码:
unsigned int vbo;
float vertices[] =
{
-1.0f, -1.0f, 0.0f, 0.0f,
+1.0f, +1.0f, +1.0f, +1.0f,
-1.0f, +1.0f, 0.0f, +1.0f,
-1.0f, -1.0f, 0.0f, 0.0f,
+1.0f, -1.0f, +1.0f, 0.0f,
+1.0f, +1.0f, +1.0f, +1.0f
};
glGenVertexArrays(1, &quad_vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindVertexArray(quad_vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
FBO VARS(在.c文件顶部):
static Texture *test_texture; // <- temp
static unsigned int quad_vao;
static unsigned int fbo;
static unsigned int colour;
FBO初始代码:
glGenFramebuffers(1, &fbo);
glGenTextures(1, &colour);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glBindTexture(GL_TEXTURE_2D, colour);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WINDOW_WIDTH, WINDOW_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colour, 0);
FBO渲染代码:
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// just draws a sprite (works completely fine without fbo bound)
vec2 position = { 0.0f, 0.0f };
vec2 scale = { 4.0f, 4.0f };
vec2 origin = { 0.0f, 0.0f };
vec4 tint = { 1.0f, 1.0f, 1.0f, 1.0f };
RenderSprite(game->renderer, test_texture,
position, 0, scale,
origin, tint);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
UseShader(GetShader(SHADER_screen)); // grabs a shader from the shader manager
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, colour);
glBindVertexArray(quad_vao);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
答案 0 :(得分:1)
您有2个顶点着色器输入:
layout (location = 0) in vec2 aPos;
layout (location = 1) in vec2 aTexCoords;
因此,您必须指定2个通用顶点属性数据数组(用于属性索引0和1):
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));