opengl - 如何呈现为无符号整数格式

标签 opengl textures glsl fbo render-to-texture

当渲染到具有无符号整数格式的 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_RGBA32FGL_RGBA8)附加到 GL_COLOR_ATTACHMENT0和一个无符号整数颜色缓冲区 (GL_RGBA32UI) 到 GL_COLOR_ATTACHMENT1

我不知道从长远来看这种方法有多实用,但这是可能的。

关于opengl - 如何呈现为无符号整数格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27509285/

相关文章:

c - OpenGL 在使用使用它制作的 dll 时给出异常

c++ - 无法将纹理绑定(bind)到 GL_QUADS

opengl-es - 将透明纹理与深度混合

c++ - OpenGL VAO VBO 着色器困惑

opengl - GLSL 分支行为

opengl - 我的纹理在屏幕上一直显示为白色

opengl - GLSL顶点着色器双线性采样高度图

c++ - 从 .glsl 文件中读取 OpenGL 着色器语言

c++ - Opengl glubyte 数组到整数值

c++ - 如何在 OpenGL 中绘制显示在 alpha 纹理后面的线框?