1

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

layout(location = 0) out float fragmentdepth;

只将深度 16 位写入纹理(GL_DEPTH_COMPONENT16如前所述),但我怎样才能在 OpenGL 2.1(GLSL 1.20)中做类似的事情?

  1. 据我所知,对于渲染深度缓冲区,我们只需将相机位置更改为光照位置,将相机方向更改为光照方向,如果我们正在绘制真实场景,则需要更改回来,对吗?
4

2 回答 2

3

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

仅将深度 16 位写入纹理(之前设置为 GL_DEPTH_COMPONENT16)

不,你不能。

这将设置fragmentdepth为写入颜色缓冲区。并且您不能将具有GL_DEPTH_COMPONENT16 图像格式的图像附加到FBOGL_COLOR_ATTACHMENTi附加点。试图这样做会给你一个GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT错误

所有版本的 GLSL 中,写入附加深度缓冲区的唯一方法是写入gl_FragDepth. 在所有版本的 GLSL 中,您只能将一个深度缓冲区附加到 FBO。尽管图像加载/存储确实允许您解决这个问题,但是您会失去深度测试等。

于 2013-01-13T19:26:45.377 回答
1

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

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

于 2013-01-13T13:28:12.693 回答