关于 OpenGL 纹理、帧缓冲区和 UV 坐标的问题 [关闭]

Posted

技术标签:

【中文标题】关于 OpenGL 纹理、帧缓冲区和 UV 坐标的问题 [关闭]【英文标题】:Question about OpenGL textures, Frame Buffers and UV coordinates [closed] 【发布时间】:2021-04-18 15:59:44 【问题描述】:

我正在尝试将帧缓冲区对象的纹理映射到三角形网格平面。问题是它最终是黑色的。

帧缓冲区代码。

    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);

    glGenTextures(1, &fbo_texture);
    glBindTexture(GL_TEXTURE_2D, fbo_texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, height, width, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, 0);

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_texture, 0);

所以。问题出在哪里:(

【问题讨论】:

“我正在尝试将纹理从帧缓冲区对象映射到三角形网格平面。” - 你想说的是你想要生成纹理然后将该纹理放在网格上。 在绘制网格之前是否绑定了默认的帧缓冲区? - glBindFramebuffer(GL_FRAMEBUFFER, 0); @Rabbid76 我愿意,是的。 出于调试目的进行一些更改。区分纹理生成或图元绘制是否失败。例如color = texture(texture, texpos) + 0.5; @Rabbid76 啊,好的,所以当我这样做时,表面确实出现了。不知道这意味着什么。此外,制服的名称不是问题。这不是我在程序中实际使用的。 【参考方案1】:

纹理对象和纹理采样器制服之间的绑定是通过纹理单元实现的。您需要分配纹理对象所绑定的纹理单元的编号,而不是纹理采样制服上的纹理对象:

glUniform1i(textureUniform, fbo_texture);

glUniform1i(textureUniform, 0);

您的着色器无法编译,因为采样器统一变量与函数texture 同名。重命名统一变量:

uniform sampler2D u_texture;

void main()
 
    color = texture(u_texture, texpos);

【讨论】:

感谢您的快速回复 :) 但是,当我尝试这样做时,表面无法渲染。 @RealName 你必须重命名制服。我已经扩展了答案。

以上是关于关于 OpenGL 纹理、帧缓冲区和 UV 坐标的问题 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL,渲染纹理上的异常伪影,渲染坐标? [关闭]

✠OpenGL-8-阴影

OpenGL 帧缓冲区 - 渲染到纹理创建带有主帧缓冲区内容的纹理

opengl 高级技巧

OpenGL ES有不同的UV坐标?

Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样