Iphone GLKit中的纹理映射不仅在设备中有效
我使用中的代码映射人脸的纹理。此代码使用GLKIT渲染图像。代码在模拟器中运行良好,但如果我在设备中运行相同的代码,它将不工作。下面是它在设备中工作而不是在我的ipad中工作的图像的屏幕截图 用于加载纹理的代码:Iphone GLKit中的纹理映射不仅在设备中有效,iphone,ios,objective-c,opengl-es,glkit,Iphone,Ios,Objective C,Opengl Es,Glkit,我使用中的代码映射人脸的纹理。此代码使用GLKIT渲染图像。代码在模拟器中运行良好,但如果我在设备中运行相同的代码,它将不工作。下面是它在设备中工作而不是在我的ipad中工作的图像的屏幕截图 用于加载纹理的代码: - (void)loadTexture:(UIImage *)textureImage { glGenTextures(1, &_texture); glBindTexture(GL_TEXTURE_2D, _texture); glTexParamet
- (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));
}
模拟器图像:
设备中的相同代码提供以下输出:
有什么我遗漏的吗
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转向iPad i、 e.视网膜到非视网膜 在我看来,你的图像加载可能忽略了视网膜比例,因此iPad上的纹理贴图“太大了2倍”
使用苹果的方法(我的另一个答案)应该可以自动解决这个问题,但如果不行的话:你可以试着制作两个图像副本,一个是当前大小的(名为image@2x.png)和一个一半大小的(在photoshop/preview.app/etc中调整大小)(名为“image.png”)我最终屈服并切换到GLKTextureLoader。正如亚当提到的,它非常坚固 下面是一个可能适合您的实现:
- (void)loadTexture:(NSString *)fileName
{
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],
GLKTextureLoaderOriginBottomLeft,
nil];
NSError* error;
NSString* path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
GLKTextureInfo* texture = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error];
if(texture == nil)
{
NSLog(@"Error loading file: %@", [error localizedDescription]);
}
glBindTexture(GL_TEXTURE_2D, texture.name);
}
我将很快为GitHub上的
mtl2opengel
项目更改它…有人能回答我的问题吗!!支票:谢谢你的回复。问题出在模拟器和设备之间。I imulator它工作,而在设备中它不工作:(如果使用视网膜模拟器和非视网膜模拟器,会发生什么情况?(使用硬件菜单切换)你确定你的修复@Adam吗?我编写了原始的纹理加载代码,并在另一个应用程序中用你的建议替换了它,但结果更糟。我不是OpenGL专家,所以我的实现可能仍然是错误的,但这段代码也不起作用。不过,对超出范围的代码调用很好。下面是我使用bot的一个结果h方法(不同的应用程序,带视网膜显示的iPhone模拟器)。@RicardoRendonCepeda哪一位?我的主要建议是使用苹果的代码,因为它可以工作!永远!底部的复制/粘贴代码用于在内存中生成数据的情况(苹果仅部分支持)它的性能比苹果的代码要高得多。在这种情况下,你需要了解你的数据格式并适应我在那里得到的格式(RGBA)或更改你提供给OpenGL的信息——但如果你使用的是自定义非标准图像数据格式,我想你知道你在做什么,知道如何处理:)…不,我也在使用标准RGBA。公平地说,我已经有一段时间没有对这个项目给予适当的关注了,并且对它的最初目的感到满意(此外,没有iPad=没有彻底的测试)。我在GLKit之前就开始使用OpenGLES2.0,所以我还需要更详细地了解GLKTextureLoader。谢谢你的回答Ricardo。我会尽力尽快给你回复。非常感谢\