2013-03-13 24 views
7

我使用this link中的代码来映​​射人脸纹理。此代码使用GLKIT来呈现图像。代码可以在模拟器中正常工作,但如果我在设备中运行,则代码不起作用。下面是它在设备中运行的图像的屏幕截图,而不是在我的ipad中。GLKit中的纹理映射不适用于设备

码I用于加载纹理:模拟器的

- (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)); 
} 

图片:

Output in simulator

在装置中的相同的代码给出以下输出:

Output in Device

有什么我失踪了?

+0

可以有人请回答我的问题!! – 2vision2 2013-03-20 03:58:51

+1

检查:http://stackoverflow.com/a/7952288/2128327 – 2013-03-26 17:10:09

回答

2

我终于屈服了,并切换到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上的mtl2opengl项目很快...

+0

感谢您对Ricardo的回答,我会尽力回复您很快,非常感谢。\ – 2vision2 2013-04-17 03:14:13

3
  1. 使用Apple的内置1行方法加载 - 不要编写自己的(破坏的)实现!

    https://developer.apple.com/library/mac/#documentation/GLkit/Reference/GLKTextureLoader_ClassRef/Reference/Reference.html#//apple_ref/occ/clm/GLKTextureLoader/textureWithContentsOfFile:options:error


  1. 或者,如果你必须自己做,你有两个可疑的部分:

    2.1。摆脱这一行:

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

    2.2。这条线使用超出范围的数字,这不是很好:

    glGenTextures(1,& _texture);


  1. 如果由于某种原因,你不能使用苹果的代码(例如你要加载在内存中的图像原始数据),这里的工作代码复制/粘贴:

    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); 
    
+0

你确定你的修复@Adam?我写了原始纹理加载代码和用另一个应用程序中的建议代替它,但结果更糟糕。我不是OpenGL的专家,所以我的实现可能仍然是错误的,但是这个代码也没有工作。尽管如此,还是请求超出范围的数字。 – 2013-04-02 15:20:40

+0

这里是我的结果使用两种方法[不同的应用程序,iPhone模拟器W /视网膜显示]的[截图](http://i.imgur.com/pSVWEGr.png)。 – 2013-04-02 15:36:05

+0

@RicardoRendonCepeda哪位?我的主要建议是使用Apple的代码,因为它的工作原理!总是! – Adam 2013-04-03 15:51:49

2

查看屏幕截图......我想知道问题是否是从iPhone到iPad?

即视网膜到非视网膜?

在我看来,像你的图片加载可能是忽略视网膜比例尺,使纹理贴图在iPad上“2倍太大”。

使用Apple的方法(我的其他答案)应该自动修复,但如果不能:您可以尝试制作两个图像副本,一个为当前尺寸(名为“[email protected]”),另一个为半尺寸(在photoshop/preview.app/etc中调整大小)(名为“image”。PNG“)

+0

感谢您的回复。问题出在模拟器和设备之间。我的模拟器它的工作原理和它在设备中没有:( – 2vision2 2013-04-02 12:28:05

+0

如果您使用RETINA simualator与非RETINA模拟器会发生什么?(使用硬件菜单进行切换) – Adam 2013-04-02 13:59:28