这两个函数是完全正交的。
选择在glTexImage2D
和之间glTexStorage2D
。这两个都为纹理图像分配存储空间;他们只是以不同的方式做到这一点。
glTexImage2D
是分配存储的旧方式。它创建可变存储(还有其他函数也可以创建可变存储)。如果您想要 mipmap,则必须通过单独调用函数来分配每个 mipmap 级别,手动计算 mipmap 图像的大小(请参阅下面的例外情况)。
glTexStorage2D
为图像数据分配不可变的存储空间。它一次性分配所有你想要的 mipmap。
顾名思义,不可变存储无法更改。看,你可以调用glTexImage2D
相同的 mipmap 级别,但大小不同。如果你这样做了,OpenGL 将破坏原来的 mipmap 层并为新层分配存储空间。您甚至可以更改格式。
不可变存储不会让您更改任何内容。您可以使用glTexSubImage2D
. 但是这些功能不会改变存储;他们改变了内容。
glTexImage2D
并且glTexStorage2D
喜欢malloc
。glTexSubImage2D
就像memcpy
; 它仅适用于现有内存。
glGenerateMipmap
是一个函数,它将获取纹理的基础层并为来自该基础层的所有 mipmap 生成数据(给定 mipmap 范围)。它会这样做一次。把它想象成一个渲染函数;它完成了它的工作,然后就完成了。
对于可变存储纹理,glGenerateMipmap
还将为先前未分配的 mipmap 范围内的任何 mipmap 分配存储。这就是为什么您可以调用glTexImage2D
一次,然后调用glGenerateMipmap
强制它制作所有其他 mipmap,而无需手动执行。