【发布时间】:2015-03-11 16:19:37
【问题描述】:
我读过很多地方,应该避免使用 3 字节长的 OpenGL 纹理,并且应该始终使用 4 字节总线对齐的表示。记住这一点,我有几个关于 glTextImage2D API 的问题。
从文档来看,API 签名是:
void glTexImage2D(GLenum target, GLint level, GLint internalformat,
GLsizei width, GLsizei height, GLint border,
GLenum format, GLenum type, const GLvoid * data);
我是否正确假设如果我有一个 RGB 图像并且我想要一个 RGBA 表示,将 internalformat 参数指定为 GL_RGBA 并将 format 参数指定为 GL_RGB 就足够了?生成贴图的时候会不会有格式之间的内部转换?
我的第二个问题是如果我有灰度数据(所以只有一个通道)怎么办。是否可以将其表示为 GL_RED 还是使用 4 字节表示更好?
【问题讨论】:
-
对于
GL_RGB和GL_RGBA,任何真实世界的GPU 都将使用每个纹素4 字节对齐作为internalFormat。您所指的建议只是想确保选择与 GPU 将在内部使用的最匹配的 客户端format,而不是切换internalFormat。你不会在你的场景中获得任何东西。 -
抱歉有点糊涂了。因此,如果我的数据是 RGB,如果我用 internalformat=GL_RGBA 和 format=GL_RGB 调用它,我会失去任何性能吗?
-
当您的输入是
GL_RGB时,选择GL_RGBA而不是GL_RGB作为internalFormat不会有任何影响。你还担心什么?纹理上传或纹理采样的性能(在这种情况下两者都不会改变,但您的问题不是很清楚)。 -
客户端内存中的数据将与 GPU 内存中数据的内部组织完全不同。这不仅仅是 2D 数组的线性存储,就像人们可能天真地假设的那样。数据将以更加缓存友好的方式组织,通常使用 Z 阶曲线一般原理的一些高级版本,并且特定格式是高度特定于实现的。这也是为什么在客户端应该首选对齐良好的数据格式的原因 - 在任何情况下都会发生重播,但对齐会使该过程更加高效。
-
是的。使用纹理根本不会对 RGB 与 RGBA 造成任何损失。只有上传有一些额外的工作。实际上,这个成本并没有听起来那么高。通常,限制是总线传输(和多个数据副本)。如果您关心快速纹理上传/流式传输,则应使用 PBO 并注意避免隐式同步。
标签: opengl graphics 3d textures