0

glTexImage2D 的文档说

GL_RED(用于 GL)/GL_ALPHA(用于 GL ES)。“GL 将其转换为浮点数并通过附加 0 表示绿色和蓝色以及 1 表示 alpha 将其组装成 RGBA 元素。每个组件都被限制在 [0,1] 范围内。”

我已经阅读了 GL ES 规范,看看它是否指定 GPU 内存实际上是 32 位还是 8 位,但它似乎相当模糊。谁能确认上传纹理作为 GL_RED / GL_ALPHA 是否会在 GPU 上从 8 位转换为 32 位?

我对 GL 和 GL ES 的答案很感兴趣。

4

2 回答 2

3

我已经阅读了 GL ES 规范,看看它是否指定 GPU 内存实际上是 32 位还是 8 位,但它似乎相当模糊。

嗯,就是这样。实际细节留给实际实现来决定。在规范中给予这样的自由允许实际的实现包含针对目标系统紧密定制的优化。例如,某个 GPU 可以更好地处理每通道 10 位的格式,因此可以自由转换为这种格式。

所以一般来说不可能说,但是对于特定的实现(即GPU +驱动程序),可能会选择某种格式。哪一个取决于 GPU 和驱动程序。

于 2013-07-04T20:48:20.147 回答
0

根据 datenwolf 所说的,我在“POWERVR SGX OpenGL ES 2.0 应用程序开发建议”文档中找到了以下内容:

6.3. 纹理上传
当您通过 glTexImage2D 将纹理上传到 OpenGL ES 驱动程序时,输入数据通常是线性扫描线格式。不过,在内部,POWERVR SGX 使用旋转布局(即遵循平面填充曲线)在纹理化时大大改善内存访问局部性。由于这种不同的布局,上传纹理总是需要一些昂贵的重新格式化操作,无论输入像素格式是否与内部像素格式完全匹配。

出于这个原因,我们建议您在应用程序或关卡启动时上传所有必需的纹理,以免在稍后上传其他纹理时导致任何帧率下降。

您尤其应避免在帧中将纹理数据上传到已在帧中使用的纹理对象。

于 2013-07-05T09:19:28.637 回答