c++ - 向不可变纹理存储提供数据

标签 c++ opengl

有没有办法直接(即,不是复制或填充)向具有不可变存储的纹理提供数据,而不是 glTexSubImage*?我知道可能不需要一个单独的函数来完成这个角色,但我确实想知道为什么你不能在分配内存的同一行中指定数据(与不可变缓冲区对象的方式相同)。

最佳答案

I do wonder why you can't specify the data in the same line you allocate your memory (in the same manner as immutable buffer objects).

纹理比缓冲区对象复杂得多。

纹理的不可变存储 API 为该纹理分配所有指定的 mipmap 级别。然而,various pixel transfer functions在一次操作中,至多只上传一个 mipmap 级别的像素数据。在任何像素传输操作中都没有规定传输超过单个 mipmap 级别的数据。事实上,process of pixel transferring仅对给定维度的单个图像有意义(阵列纹理被视为更高维度的图像)。 Mipmap 层级在层与层之间改变它们的大小,这使得像素传输操作改变了它的意义。特别是关于一些 pixel transfer parameters像子图像选择器。

因此,如果您要上传到具有多个 mipmap 的纹理,则无论如何都需要进行多次调用。那么还有什么?

此外,请注意 glTexImage*glCompressedTexImage* 采用不同的参数。前者通过 pixel transfer functionality 获取像素数据,后者采用预压缩数据。但是他们都分配存储空间。如果您要使 glTexStorage* 更类似于 glTexImage*,那么您还必须添加 glCompressedTexStorage*。所以现在你有了另一系列的功能,唯一的区别是他们做什么样的上传。

相比之下,缓冲区仅包含一个字节数组,并且只有一种上传方式。

总的来说,最好只使用现有的 SubImage 基础架构进行上传,并且分配与它完全分开。

关于c++ - 向不可变纹理存储提供数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837095/

相关文章:

c++ - Hello World 和 V8

linux - 为什么这个 GLUT 程序无法编译?我缺少库或 header 吗?

c++ - 在 C++ 中获取广泛的类型错误

c++ - stm32f4 g++ 错误涉及newlib _kill_r,_kill, _getpid_r, _getpid,

c++ - 从二值图像中屏蔽一个 Blob

c++ - 元编程,试图避免许多特化

macos - 使用GLFW库的Mac OSX 10.9上的OpenGL 3.3/4.1

c# - 等价于 C# 中的 yield

c++ - glTexImage2D 复制数据还是只是指定它?

c++ - OpenGL 顶点数组球体杂散顶点