首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GL_R8和GL_R8UI在OpenGL中有区别吗?

GL_R8和GL_R8UI在OpenGL中有区别吗?
EN

Stack Overflow用户
提问于 2017-05-30 06:37:56
回答 1查看 2.5K关注 0票数 2

我创建了一个模块ModernGL,以简化OpenGL在python3中的使用。

这就是我如何为包含1、2、3或4个组件的呈现缓冲区选择合适的格式:

代码语言:javascript
复制
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的呈现缓冲区将选择format=GL_R8

以前(在这个提交之前)我有:

代码语言:javascript
复制
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_R8GL_R8UI有什么区别?
  • 为什么我能够用GL_R8UI创建一个Renderbuffer,但是读取失败了。

注意:--我用GL_R8UIGL_RGB8UIGL_RGBA8UI进行了测试--在调用glReadPixels时,它们中没有一个在工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-30 07:11:09

很久以前,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

对于呈现缓冲区也是如此。如果您的片段着色器以以下内容开头:

代码语言:javascript
复制
out float Color;

然后您可以呈现给GL_R8

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

代码语言:javascript
复制
out uint Color;

然后,您必须呈现为一种不同的格式,如GL_R8UI。注意,整数的规则在OpenGL中有些限制:不能使用带整数纹理的筛选,也不能将α混合用于片段输出(尽管可以使用ADDSUBTRACTMINMAX )。

总之,GL_R8GL_R8UI都与GL_UNSIGNED_BYTE兼容,但是当您在程序中使用它们时,它们的工作方式完全不同。这就是为什么OpenGL函数不再仅仅将许多组件作为参数。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44255145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档