如何将[0,1]之外的值写入gl_FragData

时间:2012-06-09 07:19:25

标签: opengl glsl

我试图通过gl_FragData写出一个视图空间位置。

不幸的是这个值似乎被钳制了[0-1] (或者至少是我读回来的时候)

有没有办法不夹住它?

3 个答案:

答案 0 :(得分:2)

只需使用浮点纹理:GL_RGBA16F,GL_RGBA32F等......它们没有被钳制

http://www.opengl.org/wiki/Floating_point_and_mipmapping_and_filtering

我使用(用于创建空浮点纹理):

glGenTextures(1, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);        
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);    
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, NULL); 

答案 1 :(得分:1)

您可以使用GL_ARB_color_buffer_float扩展名设置浮点颜色缓冲区:使用浮点格式存储片段,通过启用/禁用CLAMP_FRAGMENT_COLOR_ARB开关可以钳制/松开结果(使用ClampColorARB)。

请注意,这不是基于纹理的技术,但它定义了一个真正的颜色缓冲区。遗憾的是,此颜色缓冲区无法在普通窗口上显示(屏幕外渲染)。


尊重GL_ARB_texture_float扩展名,GL_ARB_color_buffer_float允许控制固定渲染管道的夹持行为(分离顶点阶段和片段阶段)。

但是,定义颜色缓冲区不允许您拥有多个颜色缓冲区。相反,使用浮点纹理可以设置更复杂的帧缓冲对象。

但是,请注意texture_float扩展中的以下讨论:

  

是否为固定功能GL钳制了浮点值?

   RESOLVED:  This extension introduces texel values that can be
   outside [0, 1].  No clamping occurs to these values during
   texture filtering.  For the fixed-function pipeline, the
   filtered texel is now clamped before it is used for texture
   environment blending.  The ARB_color_buffer_float extension
   can be used to control this clamping.  For the programmable
   pipelines, no clamping occurs.

答案 2 :(得分:0)

您需要禁用颜色夹持:

glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FALSE);