将深度缓冲区和纹理缓冲区发送到同一个片段OpenGL3

3

这可能是一个愚蠢和琐碎的问题,但由于我对OpenGL比较新,我不明白如何将来自单个FBO的颜色缓冲区和深度缓冲区发送到片段着色器。
我的FBO生成了1个纹理缓冲区和1个深度缓冲区。

   glGenTextures(1, &texture_color);
   glBindTexture(GL_TEXTURE_2D, texture_color);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);    
   glGenTextures(1, &texture_depth);
   glBindTexture(GL_TEXTURE_2D, texture_depth);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);

and I would like, in my fragment buffer to have

uniform sampler2D colorTexture;
uniform sampler2D depthTexture;

需要同时填充颜色和深度纹理...

我可以使用GlBindtexture只发送其中一个,而且效果很好,但是我无法同时发送两个。是否有人知道如何做到这一点?

谢谢!


你知道的,欢迎你对问题进行更详细的阐述,并提供(并接受)自己的答案。虽然可能会有类似的问答,但对其他人仍然可能有帮助... - Brett Hale
没错!你说得对,我会这么做的!我会尽力把我学到的一切都解释清楚 :) - Raph Schim
1个回答

1

好的,我可能不是一个大牛,因为解决方案很简单,而且我刚才做错了。

我试图使用 glActiveTexture(GL_DEPTH) 然后绑定我的纹理:(glBindTexture(GL_TEXTURE_2D, visibilityFBO.getDepthTexture());),认为使用 GL_DEPTH 是正常的。

但是我错了,

正确的方法是:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, visibilityFBO.getColorTexture()); 
glUniform1i(glGetUniformLocation(visibilityPassShader.Program, "positionTexture"), 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, visibilityFBO.getDepthTexture());
glUniform1i(glGetUniformLocation(visibilityPassShader.Program, "depthTexture"), 1);

这与以前相同,但是由于我使用了glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT24,width,height,0,GL_DEPTH_COMPONENT,GL_FLOAT,0);来生成我的深度纹理,因此深度被认为是一种纹理。所以我只需要调用下一个纹理并绑定它就可以使用它。

在片段中,仍然是:

uniform sampler2D positionTexture;
uniform sampler2D depthTexture;

在良好的顺序中。

使用OpenGL >= 4,您可以在片段着色器中使用

layout (binding = 0) uniform sampler2D positionTexture;
layout (binding = 1) uniform sampler2D depthTexture;

请忽略源代码中关于glUniform1i的部分。

希望能对某些人有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接