我创建了一个模块ModernGL,以简化OpenGL在python3中的使用。
这就是我如何为包含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);例如,带有components=1和floats=False的呈现缓冲区将选择format=GL_R8
以前(在这个提交之前)我有:
const int int_formats[] = {0, GL_R8UI, GL_RG8UI, GL_RGB8UI, GL_RGBA8UI};根据这份文件:如果你想要一个3分量的无符号积分格式,每个组件有8位,你可以使用GL_RGB8UI。一种使用每个组件16位的1组件浮点格式是GL_R16F.
然而,
当我选择GL_R8UI时,glReadPixels()将与GL_INVALID_OPERATION一起失败,当我选择GL_R8时,glReadPixels()将将像素读取为unsigned chars
我有一个不受支持的格式失败的测试。
GL_R8和GL_R8UI有什么区别?GL_R8UI创建一个Renderbuffer,但是读取失败了。注意:--我用GL_R8UI、GL_RGB8UI和GL_RGBA8UI进行了测试--在调用glReadPixels时,它们中没有一个在工作。
发布于 2017-05-30 07:11:09
很久以前,OpenGL函数的工作方式与简化的API一样。他们接受1,2,3或4作为“组件的数量”,并选择正确的格式。这早已被抛弃,因为我们不仅想要支持太多不同的格式,而且我们也希望能够以不同的方式解释这些格式。
考虑数据类型GL_UNSIGNED_BYTE。
GL_R8,与uniform sampler2D一起生成vec4。GL_R8UI,与uniform usampler2D一起生成uvec4。对于呈现缓冲区也是如此。如果您的片段着色器以以下内容开头:
out float Color;然后您可以呈现给GL_R8。
但是,如果您的片段着色器以以下内容开头:
out uint Color;然后,您必须呈现为一种不同的格式,如GL_R8UI。注意,整数的规则在OpenGL中有些限制:不能使用带整数纹理的筛选,也不能将α混合用于片段输出(尽管可以使用ADD、SUBTRACT、MIN或MAX )。
总之,GL_R8和GL_R8UI都与GL_UNSIGNED_BYTE兼容,但是当您在程序中使用它们时,它们的工作方式完全不同。这就是为什么OpenGL函数不再仅仅将许多组件作为参数。
https://stackoverflow.com/questions/44255145
复制相似问题