【问题标题】:glTexImage2d and Null dataglTexImage2d 和 Null 数据
【发布时间】:2013-12-05 01:11:30
【问题描述】:

这是一个奇怪的问题,但我想知道为什么 glTexImage2d 关心 Null 数据的像素数据类型和格式。 glTexImage2d 的签名是...

void glTexImage2D( GLenum target, GLint level, GLint internalFormat, 
           GLsizei width, GLsizei height, GLint border, GLenum format, 
           GLenum type, const GLvoid * data);

internalFormat 的作用是告诉图形驱动程序你想在 gpu 上存储什么数据,格式和类型告诉图形驱动程序对 GLvoid * 数据的期望。所以,如果我不传递任何数据,例如传递 null,为什么图形驱动程序关心格式和类型是什么?所以这是一个奇怪的问题,因为有时它不会。它发生的时间,我没有检查每一次迭代,但是,特别是在制作深度纹理时,或者我最近遇到的是整数类型,如 GL_RED_INTEGER、GL_RG_INTEGER 等和/或它们对应的内部格式,如 GL_R8I、GL_RGBA32UI。然而,任何“简单”类型都不必与 internalFormat 相对应,例如 GL_RGBA8、GL_RGBA32F 等。出于某种原因,即使您没有通过,前一种特定的数据类型和格式也必须准确无误任何数据。这是为什么呢?

【问题讨论】:

    标签: c++ c opengl texture2d


    【解决方案1】:

    glTexImage2D (...) 的调用有两种格式,内部格式和用于像素传输的格式。内部格式是为纹理分配存储空间所必需的,GL 使用像素传输格式来解释您传递的(可选)像素数组。

    当您为像素数据传递NULL 时,不会发生像素传输,因此您会认为formattype 是不必要的。从技术上讲,在这种情况下它们是不必要的,但 GL 仍然验证格式和类型对。您可以在那里使用任何您想要的有效值对,因为实际上不会发生像素传输操作。您所做的只是分配纹理存储。

    顺便说一句,glTexStorage2D (...) 是一种无需像素传输即可分配纹理存储的现代方式。您可以通过这种方式创建不可变纹理,这样您就不会意外地通过不正确的 glTexImage2D (...) 调用重新定义纹理 LOD。使用glTexStorage2D (...) 分配纹理存储后,您可以通过调用glTexSubImage2D (...) 为其提供数据。

    【讨论】:

      【解决方案2】:

      如果您不传递任何数据,它仍会在 GPU 上分配内存以供进一步使用。这就是为什么您必须指定确切的格式;告诉 GPU 它必须保留多少内存。

      【讨论】:

      • 我很确定他指的是像素传输format,而不是internalFormat;)您甚至可以在不指定旧实现的确切格式的情况下逃脱 - 它被声明为@ 987654324@ 而不是 GLenum 因为你 used to (GL 2.x) 可以使用 1,2,3 或 4 来表示 internalFormat 来告诉 GL 纹理图像需要多少组件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多