我创建了一个模块ModernGL,以简化OpenGL在python3中的使用。在
这是我如何为包含1、2、3或4个组件的renderbuffer选择正确格式的方法:
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
的renderbuffer将选择format=GL_R8
以前(在此之前),我有:
^{pr2}$According to this documentation: If you want a 3-component unsigned integral format, with 8 bits per component, you use GL_RGB8UI. A 1-component floating-point format that uses 16-bits per component is GL_R16F.
但是
当我选择GL_R8UI
时,glReadPixels()将失败,并返回{GL_R8
时,glReadPixels()将以unsigned chars
的形式读取像素
我有一个test,它以不支持的格式失败。在
GL_R8
和{GL_R8UI
创建Renderbuffer,但是读取失败。在注意:我测试了GL_R8UI
、GL_RGB8UI
和{glReadPixels
时,它们都没有工作。在
很久以前,OpenGL函数的工作方式与简化的API相同。他们接受1、2、3或4作为“组件数量”,并选择正确的格式。这一点早就被放弃了,因为我们不仅希望支持太多不同的格式,而且还希望能够以不同的方式解释这些格式。在
考虑数据类型
GL_UNSIGNED_BYTE
。在我们可以将其规范化,将其转换为0..1范围内的浮点数,精度为8位。内部格式}。
GL_R8
,带有uniform sampler2D
,产生{我们可以决定不让它正常化。同上,只是现在值在0到255范围内。
我们可以把它当作0到255范围内的整数。内部格式}。
GL_R8UI
,带有uniform usampler2D
,产生{对于renderbuffers也是如此。如果碎片着色器以以下内容开头:
然后可以渲染到
GL_R8
。在但是,如果碎片着色器以以下内容开头:
^{pr2}$然后您必须呈现为不同的格式,如})。在
GL_R8UI
。请注意,在OpenGL中,整数的规则有一定的限制:不能对integer纹理使用过滤,也不能将alpha混合与片段输出一起使用(但是可以使用ADD
、SUBTRACT
、MIN
,或{所以简而言之,}都与
GL_R8
和{GL_UNSIGNED_BYTE
兼容,但在程序中使用它们时,它们的工作方式完全不同。这就是为什么OpenGL函数不再只是将一些组件作为参数。在相关问题 更多 >
编程相关推荐