当渲染到具有无符号整数格式的 FBO 时,我大概不能:
gl_FragColour = uvec4(100,100,100,100);
因为 gl_FragColour 是一个 vec4。所以大概我必须定义自己的out?
out uvec4 colour
但是在没有任何其他更改的情况下,这会被正确解释吗?
我还想对 unsigned int 格式和普通浮点纹理使用相同的着色器,if 在统一(静态分支)上。我猜这是不可能的(除非我可以有 2 个出局并且只设置一个?)我可能不得不探索一种函数指针方法?
最佳答案
So presumably I would have to define my own out?
是的,当然。您必须声明自己的片段数据输出,以写入除浮点颜色值之外的任何内容。
请注意,像 GL_RGB8
这样的“UNORM”(无符号规范化)格式将浮点颜色作为其输入,即使它们是定点数据类型。真正的古怪实际上是 OpenGL 3.0 中引入的新的 INT/UINT 格式;它们没有定义浮点到整数的转换,因此只能使用整数颜色写入。
But will this be interpreted correctly without any other changes?
传统上发生的情况是该值被钳制在 [0.0,1.0] 范围内,然后在 99% 的情况下输出颜色格式是无符号归一化的,每个分量都重新缩放到定点范围(例如 if GL_RGB8
=> (float_color * 255 ))。
如果您有浮点或整数颜色缓冲区,则钳位和缩放行为不再适用,但当然,如前所述,将浮点颜色写入整数颜色缓冲区是未定义的。这就是为什么当整数颜色格式(有符号和无符号整数)被引入核心 GL 时,gl_FragColor
被弃用(GL 3.0)。
Also I wanted to use the same shader for both unsigned int formats and normal float textures with a if on a uniform (static branch). I am guessing that would be out of the question (unless I can have 2 outs and only set one?) and I might have to explore a function pointer approach?
其实,这是可行的。但这需要您使用两个不同的 FBO 图片附件位置。
想象一下下面的着色器:
#version 330
uniform bool is_float;
layout(location = 0) out vec4 frag_color_float;
layout(location = 1) out uvec4 frag_color_uint;
void main (void) {
if (is_float)
frag_color_float = vec4 (0.1f, 0.2f, 0.3f, 1.0f);
else
frag_color_uint = uvec4 (1,2,3,0xff);
}
在上述场景中,您需要将传统的浮点或定点颜色缓冲区(GL_RGBA32F
或 GL_RGBA8
)附加到 GL_COLOR_ATTACHMENT0
和一个无符号整数颜色缓冲区 (GL_RGBA32UI
) 到 GL_COLOR_ATTACHMENT1
。
我不知道从长远来看这种方法有多实用,但这是可能的。
关于opengl - 如何呈现为无符号整数格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27509285/