ios - RGBA4444 纹理在 iPhone 上变成黑框
问题描述
我打算使用 RGBA4444 纹理来减少 iPhone 上的内存使用,但令我惊讶的是,创建的纹理始终是屏幕上的黑框,相同的代码在 Win10 上运行良好。这是我用来创建 RGBA4444 纹理的代码:
{
const int texSize = 256;
vector<unsigned char> bytes(texSize * texSize * 2, 0xFF);
GLuint id = 0;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, texSize, texSize, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, &bytes[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
我完全不知所措,iphone原生支持RGBA4444对吧?
在 iPhone5s 和 iPad3 上测试,都是黑匣子。
谢谢你。
解决方案
好的,事实证明 internalFormat 不正确:
glTexImage2D(GL_TEXTURE_2D
, 0
, GL_RGBA4 // <---- should be GL_RGBA instead of GL_RGBA4 on iPhone
, texSize
, texSize
, 0
, GL_RGBA
, GL_UNSIGNED_SHORT_4_4_4_4
, &bytes[0])
;
在 Win10 上,当 internalFormat 为 GL_RGBA4 (GLAD, es2.0) 时它可以正常工作,但是根据这个glTexImage2D,可接受的 internalFormats 是 GL_ALPHA、GL_LUMINANCE、GL_LUMINANCE_ALPHA、GL_RGB、GL_RGBA,所以即使在 WIN10 上,RGBA4444 的正确 internalFormat 仍然应该是 GL_RGBA。
推荐阅读
- kubernetes - CoreDNS 不使用 K8S / Minikube 解析命名空间外的服务 url
- c# - 如何在 C# 中保护静态 int
- sql - 在 oracle 中使用 listagg 时出错“STRING concatenation too long”
- .net - 如何通过 .NET Core 查找物理 CPU 核心数(不是逻辑 SMT 超线程)?
- oauth - oauth 范围是在什么级别定义的,在应用程序级别还是在用户级别?
- oracle - 如何在大型 CLOB 上使用 DISTINCT
- c++ - 如何在另一个类中使用带有构造函数的类?
- arrays - MongoDB.Driver.MongoWriteException:'写入操作导致错误。无法索引并行数组'
- python - 在 OpenCV 上输入更高分辨率的视频文件时 fps 低
- c++ - 为什么使用 for 和 while 循环在两个线程之间未解决锁定条件