GLGL中GL_R8和GL_R8UI有什么不同?

Sza*_*mbi 1 c++ python opengl

我创建了一个模块ModernGL来简化在python3中使用OpenGL的过程.

这就是我为具有1,2,3或4个组件的渲染缓冲区选择正确格式的方法:

const int int_formats[] = {0, GL_R8, GL_RG8, GL_RGB8, GL_RGBA8};
const int float_formats[] = {0, GL_R32F, GL_RG32F, GL_RGB32F, GL_RGBA32F};

int format = floats ? float_formats[components] : int_formats[components];

...

gl.RenderbufferStorage(GL_RENDERBUFFER, format, width, height);
Run Code Online (Sandbox Code Playgroud)

例如,使用components=1floats=False将选择的渲染缓冲区format=GL_R8

Previusly(在此提交之前)我有:

const int int_formats[] = {0, GL_R8UI, GL_RG8UI, GL_RGB8UI, GL_RGBA8UI};
Run Code Online (Sandbox Code Playgroud)

根据此文档:如果您需要3组件无符号整数格式,每个组件8位,则使用GL_RGB8UI.GL_R16F是一个单组件浮点格式,每个组件使用16位.

然而

当我选择GL_R8UIglReadPixels()将失败GL_INVALID_OPERATION 时我选择GL_R8glReadPixels()将读取像素为unsigned chars

我有一个测试失败了非支持格式.

  • GL_R8和之间有什么区别GL_R8UI
  • 为什么我能够创建一个Renderbuffer GL_R8UI,但读取失败.

注意:我测试过GL_R8UI,GL_RGB8UI并且GL_RGBA8UIglReadPixels调用时没有一个工作.

Die*_*Epp 5

很久以前,OpenGL函数就像简化的API一样工作.他们接受1,2,3或4作为"组件数量"并选择正确的格式.这一点早已被抛弃,因为我们不仅希望支持太多不同的格式,但我们也希望能够以不同的方式解释这些格式.

考虑数据类型GL_UNSIGNED_BYTE.

  • 我们可以将其标准化,将其转换为0..1范围内的浮点数,精度为8位.内部格式GL_R8,有uniform sampler2D,产生vec4.

  • 我们可以决定不对它进行标准化.与上面相同,只是现在值在0..255范围内.

  • 我们可以将它视为0..255范围内的整数.内部格式GL_R8UI,有uniform usampler2D,产生uvec4.

渲染缓冲区也是如此.如果您的片段着色器以此开头:

out float Color;
Run Code Online (Sandbox Code Playgroud)

然后你可以渲染到GL_R8.

但是,如果您的片段着色器以此开头:

out uint Color;
Run Code Online (Sandbox Code Playgroud)

然后你必须渲染到不同的格式,比如GL_R8UI.请注意,对于整数规则是在OpenGL有所限制:不能使用与整数纹理滤波,并且不能使用与阿尔法片段输出共混(可以使用ADD,SUBTRACT,MIN,或MAX虽然).

因此,在短期,GL_R8GL_R8UI与同时兼容GL_UNSIGNED_BYTE,但它们当你在程序中使用它们完全不同的工作.这就是为什么OpenGL函数不再仅仅将许多组件作为参数.