gpt4 book ai didi

c++ - OpenGL 不通过调用 glBindFramebuffer(GL_FRAMEBUFFER,0) 渲染到屏幕

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:33 26 4
gpt4 key购买 nike

通常此代码将纹理图像渲染到屏幕上。但是,如果我现在将命令 glBindFramebuffer(GL_FRAMEBUFFER,0) 添加到代码中,它将不会渲染任何内容。它以 glClearColor 的颜色呈现屏幕。我正在使用 QT,所以使用 QOpenGLWidget。

glViewport(0, 0, _width, _height);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);

_program.bind();
glBindVertexArray(_vao);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureID);
glUniform1i(glGetUniformLocation(_program.programId(), "u_texture"), 1);

glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);

可能会出错吗?

编辑:

/* 最终.fsh */

# version 330 core

uniform sampler2D u_texture;
in vec4 qt_TexCoord0;

out vec4 fragColor;

void main(void)
{
fragColor = texture(u_texture, qt_TexCoord0.xy);
}

/* 最终.vsh */

# version 330 core

layout (location = 0) in vec3 a_position;

out vec4 qt_TexCoord0;

void main(void)
{
gl_Position = vec4(a_position, 1.0);

const mat4 B = mat4(0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0);

qt_TexCoord0 = B * vec4(a_position, 1.0);
}

/* 加载 VAO 到 GPU */

GLfloat max_ = 1.0;
GLfloat min_ = -1.0;
GLfloat vert[] = {
max_, max_, 0,
max_, min_, 0,
min_, max_, 0,

max_, min_, 0,
min_, min_, 0,
min_, max_, 0,
};

glGenVertexArrays(1, &_vao);
glBindVertexArray(_vao);

GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

glBufferData(GL_ARRAY_BUFFER, sizeof(vert), vert, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, (GLvoid*)0);
glBindVertexArray(0);

最佳答案

如 G.M. 所述,并根据 the docs , glBindFramebuffer(GL_FRAMEBUFFER, 0) “打破了帧缓冲区对象与目标的现有绑定(bind)”。在使用帧缓冲区进行一些屏幕外渲染后,您需要此调用。当您想要最终呈现到屏幕上时,您必须通过调用 glDrawBuffer(GL_BACK) 来呈现后台缓冲区

所以你的渲染循环可能看起来像

// Do some rendering stuff in n offscreen textures
glBindFramebuffer(GL_FRAMEBUFFER, the_buffer);
glDrawBuffers(n, buffers);
// Rendering calls

// Finally use the results for the final rendering
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDrawBuffer(GL_BACK);
// Rendering calls

编辑:您似乎正在使用 QOpenGLWidget 作为您的 OpenGL 提供程序/窗口系统。 Qt 人员正在使用帧缓冲区来呈现他们的 UI,而您的 QOpenGLWidget 结果的内容是在 FBO 中绘制的。

所以,这意味着(至少根据我的经验,可能有更好的方法来解决这个问题),你不能再在后台缓冲区中渲染,你必须在 Qt 中渲染s 帧缓冲区

一种方法(同样,它可能根本不是最好的方法,但它对我有用)是在渲染开始时保存绑定(bind)的帧缓冲区,并在此缓冲区中进行最终渲染.这导致

// First of all, save the already bound framebuffer
GLint qt_buffer;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &qt_buffer);

// Do some rendering stuff in n offscreen textures
glBindFramebuffer(GL_FRAMEBUFFER, your_buffer);
glDrawBuffers(n, buffers);
// Rendering calls

// Finally use the results for the final rendering
if (glIsFramebuffer(qt_buffer))
{
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDrawBuffer(GL_BACK);
}
else
{
glBindFramebuffer(GL_FRAMEBUFFER, qt_buffer);
glDrawBuffers(1, buffers);
}
// Rendering calls

关于c++ - OpenGL 不通过调用 glBindFramebuffer(GL_FRAMEBUFFER,0) 渲染到屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42455918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com