关于 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 坐标的问题 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章