我正在尝试通过 gl_FragData 写出视图空间位置。
不幸的是,这个值似乎被钳制了 [0-1] (或者至少是当我读回它时)
有办法不夹吗?
只需使用浮点纹理: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);
您可以使用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.
您需要禁用颜色钳制:
glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FALSE);