7

我使用此链接中的代码来映​​射人脸的纹理。此代码使用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));
}

模拟器图片:

模拟器中的输出

设备中的相同代码给出以下输出:

设备中的输出

有什么我想念的吗?

4

3 回答 3

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. 如果由于某种原因您不能使用 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);
    
于 2013-04-01T13:00:38.300 回答
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);
}

我很快就会为mtl2openglGitHub 上的项目更改它...

于 2013-04-16T20:00:11.517 回答
2

看截图......我想知道问题是否在于你要从 iPhone 到 iPad?

即视网膜到非视网膜?

在我看来,您的图像加载可能忽略了 Retina 比例,因此 iPad 上的纹理贴图“太大了 2 倍”。

使用 Apple 的方法(我的另一个答案)应该会自动解决这个问题,但如果没有:您可以尝试制作图像的两个副本,一个为当前大小(名为“image@2x.png”),另一个为一半大小(在 photoshop 中调整大小) /preview.app/etc)(命名为“image.png”)

于 2013-04-02T12:25:27.070 回答