OpenGL/GLSL 颜色附件范围

Posted

技术标签:

【中文标题】OpenGL/GLSL 颜色附件范围【英文标题】:OpenGL/GLSL Color Attachment range 【发布时间】:2014-09-14 09:12:30 【问题描述】:

在 GLSL/OpenGL 纹理中,有没有办法存储高于 1 或低于 0 的浮点数? 我正在研究延迟渲染框架,但是当我尝试将位置存储为非同质值(第一个着色器)时,我的 phong 着色器(第二个着色器)中只得到 0-1 之间的值。 与法线相同,灯光显示错误。 解决这个问题的方法是在第一个着色器中:

gbuffer[x] =normal *0.5 +1. and in phong : normal * 2. - 1.   //(non-)homogenious    conversation

但我不想使用这种方法。

所以我目前的纹理格式是 RGB。我尝试了 RGB_16,但我得到了一个黑色窗口。

【问题讨论】:

你研究过浮点纹理吗? 【参考方案1】:

GL_RGB16仍然是归一化格式,表示采样值在0.0到1.0之间。

要获得 [0.0, 1.0] 之外的范围,您需要的是浮点纹理。具有 3 个组件的格式是 GL_RGB16F 用于 16 位浮点组件,GL_RGB32F 用于 32 位浮点组件。但是,不保证渲染目标支持这两种格式(参见 GL 4.5 规范中的表 8.12)。如果需要向它们渲染,则需要使用它们的 4 组件版本:GL_RGBA16FGL_RGBA32F

如果您的值仍有固定范围,那么您尝试通过应用偏移/比例将给定范围映射到 [0.0, 1.0] 范围的方法对我来说实际上看起来非常有效。例如,使用 GL_RGBA16 可以获得 16 位的精度,而在相同的内存使用情况下,您只能从 GL_RGBA16F 获得 12 位的精度,因为指数使用了 4 位。

【讨论】:

以上是关于OpenGL/GLSL 颜色附件范围的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 3.+ glsl 兼容性一团糟?

更快的全屏渲染(OpenGL/glsl)?

OpenGL / GLSL - 统一块数据值不正确

OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转

使用立方体贴图(OpenGL/GLSL)的点光源是不是可以实现软阴影?

带有 Assimp 的 OpenGL (GLSL) 中的骨骼动画