首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glTexImage2d和空数据

glTexImage2d和空数据
EN

Stack Overflow用户
提问于 2013-11-21 04:21:28
回答 2查看 3.2K关注 0票数 14

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

代码语言:javascript
复制
void glTexImage2D( GLenum target, GLint level, GLint internalFormat, 
           GLsizei width, GLsizei height, GLint border, GLenum format, 
           GLenum type, const GLvoid * data);

internalFormat告诉图形驱动程序您希望在图形处理器上存储什么数据,而格式和类型则告诉图形驱动程序希望从GLvoid *数据中获得什么。因此,如果我没有传递任何数据,例如,通过传递null,为什么图形驱动程序会关心格式和类型?所以这是一个奇怪的问题,因为有时它不会。当它发生的时候,我没有检查每一次迭代,但是,特别是在制作深度纹理的时候,或者我最近遇到的一些东西是整数类型,比如GL_RED_INTEGER,GL_RG_INTEGER,等等和/或它们对应的internalFormats,比如GL_R8I,GL_RGBA32UI。然而,任何“简单”类型都不必以任何方式对应于internalFormat,如GL_RGBA8、GL_RGBA32F等。由于某些原因,即使您没有传递任何数据,以前的特定数据类型和格式也必须是精确的。为什么会这样呢?

EN

回答 2

Stack Overflow用户

发布于 2013-11-21 05:40:19

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

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

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

票数 11
EN

Stack Overflow用户

发布于 2013-11-21 04:24:37

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

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

https://stackoverflow.com/questions/20106173

复制
相关文章

相似问题

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