首页 > 解决方案 > 将 GL_UNSIGNED_BYTE 上传到 GL_FLOAT 纹理

问题描述

我有一个正常创建的 OpenGL 纹理,使用GL_FLOAT它的数据类型:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, Dims.x, Dims.y, 0, GL_RGBA, GL_FLOAT, Data);

(作为数组Data正确发送。)float

然后我必须使用无符号字节形式的数据更新纹理。glTexSubImage2D使用 using更新纹理是否合法GL_UNSIGNED_BYTE

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, Dims.x, Dims.y, GL_RGBA, GL_UNSIGNED_BYTE, NewData);

NewData发送为unsigned char*。)

该文档似乎没有提及在这些函数之间使用不同数据类型的任何内容。是否可以以这种方式更新纹理,或者纹理数据是否必须转换为float*

标签: c++opengl

解决方案


在桌面 OpenGL *中,只要像素传输 格式内部格式相同,就可以进行传输。通过“种类”,我的意思是这两种格式必须谈论同一种数据。您不能将深度像素数据上传为颜色内部格式。而如果内部格式是整数格式,那么像素传输格式必须是其中一个_INTEGER版本。

但除此之外,天空是极限……只要你不喜欢表演。但是,您向纹理发送GL_FLOAT数据也不16F是特别快。

*:我提到桌面 OpenGL,因为 OpenGL ES 特别要求格式匹配。因为他们喜欢表演;)


推荐阅读