我试图通过gl_FragData写出一个视图空间位置。
不幸的是这个值似乎被钳制了[0-1] (或者至少是我读回来的时候)
有没有办法不夹住它?
答案 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);