在OpenGL中GL_R8和GL_R8UI是否不同?

2024-09-30 06:14:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个模块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=1floats=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_R8UIGL_RGB8UI和{},当调用glReadPixels时,它们都没有工作。在


Tags: youformat格式componentsfloatcomponentintr8
1条回答
网友
1楼 · 发布于 2024-09-30 06:14:45

很久以前,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也是如此。如果碎片着色器以以下内容开头:

out float Color;

然后可以渲染到GL_R8。在

但是,如果碎片着色器以以下内容开头:

^{pr2}$

然后您必须呈现为不同的格式,如GL_R8UI。请注意,在OpenGL中,整数的规则有一定的限制:不能对integer纹理使用过滤,也不能将alpha混合与片段输出一起使用(但是可以使用ADDSUBTRACTMIN,或{})。在

所以简而言之,GL_R8和{}都与GL_UNSIGNED_BYTE兼容,但在程序中使用它们时,它们的工作方式完全不同。这就是为什么OpenGL函数不再只是将一些组件作为参数。在

相关问题 更多 >

    热门问题