作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用了 this link 中的代码映射人脸的纹理。此代码使用 GLKIT 来呈现图像。代码在模拟器中运行良好,但如果我在设备中运行,则相同的代码无法运行。以下是它在设备中而不是在我的 ipad 中工作的图像的屏幕截图。
我用来加载纹理的代码:
- (void)loadTexture:(UIImage *)textureImage
{
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
CGImageRef cgImage = textureImage.CGImage;
float imageWidth = CGImageGetWidth(cgImage);
float imageHeight = CGImageGetHeight(cgImage);
CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, CFDataGetBytePtr(data));
}
模拟器图片:
设备中的相同代码提供以下输出:
有什么我遗漏的吗?
最佳答案
使用 Apple 内置的 1 行方法加载——不要编写自己的(损坏的)实现!
或者,如果你必须自己做,你有两个可疑的部分:
2.1。摆脱这一行:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2.2。这一行使用了一个超出范围的数字,这不是很好:
glGenTextures(1, &_texture);
如果由于某种原因您不能使用 Apple 的代码(例如,您想从内存图像加载原始数据),这里是工作代码的复制/粘贴:
NSData* imageData = ... // fill this yourself
CGSize* imageSize = ... // fill this yourself
GLuint integerForOpenGLToFill;
glGenTextures(1, &integerForOpenGLToFill);
glBindTexture( GL_TEXTURE_2D, integerForOpenGLToFill);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
unsigned char* pixelData = (unsigned char*) malloc( [imageData length] * sizeof(unsigned char) );
[imageData getBytes:pixelData];
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageSize.width, imageSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
关于iphone - GLKit 中的纹理映射不仅仅适用于设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15384079/
我是一名优秀的程序员,十分优秀!