OpenGL / GLSL颜色附件系列

时间:2014-09-14 09:12:31

标签: opengl textures glsl framebuffer

在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 个答案:

答案 0 :(得分:1)

GL_RGB16仍然是标准化格式,这意味着采样值介于0.0和1.0之间。

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

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