我创建了一个模块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_R8UIglReadPixels()将失败GL_INVALID_OPERATION
时我选择GL_R8glReadPixels()将读取像素为unsigned chars
我有一个测试失败了非支持格式.
GL_R8和之间有什么区别GL_R8UIGL_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 次 |
| 最近记录: |