OpenGL 2.1+中的FBO深度纹理

时间:2013-01-13 12:22:24

标签: opengl glsl

我正在学习使用GLSL创建shadown但我在这里遇到了一些麻烦:
1.在GLSL 3.3中,我们可以在片段着色器中使用此语句:

layout(location = 0) out float fragmentdepth;

只将16bit深度写入纹理(之前设置为GL_DEPTH_COMPONENT16)但是如何在OpenGL 2.1(GLSL 1.20)中做这样的事情呢?

  1. 据我所知,对于渲染深度缓冲,我们只需将摄像机位置改变为光线位置,将摄像机方向改变为光线方向,如果我们正在绘制真实场景,则需要改回来,是不是?

2 个答案:

答案 0 :(得分:3)

  

在GLSL 3.3中,我们可以在片段着色器中使用此语句:

     

只将16bit的深度写入纹理(之前设置为GL_DEPTH_COMPONENT16)

不,你不能。

这会将fragmentdepth设置为写入颜色缓冲区。并且您无法使用GL_DEPTH_COMPONENT16 image format附加图片到a GL_COLOR_ATTACHMENTi attachment point of an FBO。试图这样做give you a GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT error

所有版本的GLSL中,写入附加深度缓冲区的唯一方法是写入gl_FragDepth。在所有版本的GLSL中,您只能将一个深度缓冲区附加到FBO。虽然Image Load/Store允许你解决这个问题,但是你会失去深度测试等等。

答案 1 :(得分:1)

如前所述here如果定位OpenGL 2.1,你需要使用FBO扩展(EXT)。另外,为什么你还在使用固定管道?它已被弃用。如果您的硬件允许 - 使用OpenGL 3.3+和然后利用(核心)FBO和纹理附件(或渲染缓冲区)来绘制深度缓冲区数据。是的,你仍然可以对弃用的配置文件做同样的事情,但现代OpenGL从那时起向前迈出了一大步。

无论如何,here是你的版本所需要的。