1

我正在尝试通过 gl_FragData 写出视图空间位置。

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

有办法不夹吗?

4

3 回答 3

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); 
于 2012-06-09T07:32:52.593 回答
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.
于 2012-06-09T08:04:11.793 回答
0

您需要禁用颜色钳制:

glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FALSE);
于 2020-01-30T18:13:10.140 回答