将Depthbuffer和TextureBuffer发送到相同的Fragment OpenGL3

时间:2017-03-13 08:39:39

标签: c++ opengl opengl-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);

我希望,在我的片段缓冲区中有

uniform sampler2D colorTexture;
uniform sampler2D depthTexture;

用颜色和深度纹理填充......

我可以使用GlBindtexture发送一个或另一个(并且它运行良好),但我不能同时发送2成功。有人知道怎么做吗?

谢谢!

1 个答案:

答案 0 :(得分: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);生成我的深度纹理,所以DEPTH被认为是纹理。所以我只需调用下一个纹理并绑定它就可以使用它。

在片段中,它仍然是:

uniform sampler2D positionTexture;
uniform sampler2D depthTexture;

顺利。

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

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

并在源代码中原谅了关于glUniform1i的部分。

希望它可以帮助别人!