我创建了一个模块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=1
和floats=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_R8UI
glReadPixels()将失败GL_INVALID_OPERATION
时我选择GL_R8
glReadPixels()将读取像素为unsigned chars
我有一个测试失败了非支持格式.
GL_R8
和之间有什么区别GL_R8UI
GL_R8UI
,但读取失败.注意:我测试过GL_R8UI
,GL_RGB8UI
并且GL_RGBA8UI
在glReadPixels
调用时没有一个工作.
很久以前,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_R8
并GL_R8UI
与同时兼容GL_UNSIGNED_BYTE
,但它们当你在程序中使用它们完全不同的工作.这就是为什么OpenGL函数不再仅仅将许多组件作为参数.
归档时间: |
|
查看次数: |
605 次 |
最近记录: |