c - 2D OpenGL 渲染,FBO 完全黑色/无法正确渲染
问题描述
我在将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);
}
渲染器渲染精灵代码:
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);
解决方案
您有 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)));
推荐阅读
- swift - 周范围迅速与weekYear
- java - 如何通过控制台配置 ApacheDS Ldap 服务器?
- javascript - 无法使用 for-in 循环更改对象属性值
- android - 如何在我的 dnd 字符表项目中动态过滤子种族的公开下拉菜单?
- idris - 为什么 Idris 2 中的 cong 不进行类型检查
- node.js - nodejs/express 和 puppeteer 用我的 puppeteer 检测代码在 html 文件内完成
- javascript - Axios 拦截器 setTimeout() 在开发中工作,但在编译和部署后不工作
- scala - Spark 保存和读取 Array[Byte] 类型
- python - 为什么在 python 中使用递归时会发生这种情况?
- c# - 将 CSV 文件复制到本地 SQL Server -BCP 实用程序 C# .NET Core