Opengl 通过glTexSubImage上载纹理数据时,像素传输格式是否会更改?

Opengl 通过glTexSubImage上载纹理数据时,像素传输格式是否会更改?,opengl,opengl-es,Opengl,Opengl Es,我面临的情况是,为了兼容性,首先分配纹理的存储,然后将纹理数据上传到其中。其思想是根据是否支持不可变存储来保持代码路径相似 在没有不可变存储的情况下,通过调用glTexImage2D分配存储(使用空数据指针,没有像素解包缓冲区绑定),例如: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RG

我面临的情况是,为了兼容性,首先分配纹理的存储,然后将纹理数据上传到其中。其思想是根据是否支持不可变存储来保持代码路径相似

在没有不可变存储的情况下,通过调用
glTexImage2D
分配存储(使用空数据指针,没有像素解包缓冲区绑定),例如:

glTexImage2D(GL_TEXTURE_2D, 0,
             GL_RGBA,                           
             width, height, 0,
             GL_RGBA,                           
             GL_UNSIGNED_BYTE,
             0);
在此之后,将上载实际数据:

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
                width, height,
                GL_RGBA,
                GL_UNSIGNED_BYTE,
                data);

问题是:上传时,像素传输格式是否与分配存储时指定的格式不同?有些驱动程序认为是,有些驱动程序(特别是:角度)认为不是

换句话说,那么这个电话应该有效吗

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
                width, height,
                GL_RGBA,
                GL_FLOAT, // <-- DIFFERENT
                data);
glTexSubImage2D(GL_纹理_2D,0,0,0,
宽度,高度,
格尔巴,
GL_浮动,//
那么,我的解释正确吗


一句话:是的。它被称为内部格式和像素数据格式是有原因的。ANGLE是OpenGL ES的模拟,因此遵循为此指定的规范和行为。这与您的观察一致。

对不起,什么是“一致的”用什么?我解释OpenGL ES 2.0规范的方式与解释OpenGL 4.5的方式相同——“使用相同的值”意味着“接受来自相同集合的值”。因此,角度行为在这里是错误的。@peppe:我必须重新仔细阅读ES规范中的这一部分。在原始文章中添加了一些位。@peppe:OpenGL ES与桌面GL不同,它不支持像素传输期间的数据转换。您的内部格式必须与像素数据格式相匹配,这就是为什么在E这完全是为了简化ES中的实现,在像素传输过程中转换图像格式会增加许多不必要的复杂性,这显然只在desktop GL中才有价值;)@AndonM.Coleman:这就是我最初解释ES规范措辞的方式。