【问题标题】:FBO depth texture in OpenGL 2.1+OpenGL 2.1+ 中的 FBO 深度纹理
【发布时间】:2013-01-13 12:22:24
【问题描述】:

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

layout(location = 0) out float fragmentdepth;

仅将深度 16 位写入纹理(之前设置为 GL_DEPTH_COMPONENT16),但我如何在 OpenGL 2.1 (GLSL 1.20) 中执行类似的操作?

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

【问题讨论】:

  • 我认为您应该将深度缓冲区附加到 fbo,然后渲染到 gl_FragDepth;我不确定您是否不需要为此进行扩展。
  • @BartekBanachewicz:我在我的项目中使用过 glew,谢谢,我会试试 gl_FragDepth :)

标签: opengl glsl


【解决方案1】:

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

仅将深度 16 位写入纹理(之前设置为 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 确实允许您解决这个问题,但您会失去深度测试等。

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 非常感谢。我只有一个支持 OpenGL 2.1 的 Intel GMA 945 显卡,但我正在阅读 OpenGL 3.3 教程,哈哈。感谢您的链接,这对我来说似乎非常有用:D
  • OpenGL 2.1 不一定是固定功能的。它没有弃用它,但它也支持现代 OpenGL。
猜你喜欢
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多