在GLKit纹理映射没有在设备仅工作(Texture mapping in GLKit is not

2019-08-17 13:19发布

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

模拟器的图片:

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

是不是有什么我真的失踪了?

Answer 1:

我终于屈服了,并切换到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);
}

我会改变它的mtl2opengl很快在GitHub上的项目...



Answer 2:

  1. 使用苹果的内置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); 


Answer 3:

看着截图...我不知道,如果问题是,你会从iPhone到iPad?

即视网膜非视网膜?

在我看来就像你的图像加载可能会被忽略的Retina规模,使纹理贴图“2倍太大”在iPad上。

利用苹果公司的方法(我的其他答案)应自动修复,但如果不能,你可以尝试使图像的两个副本,一个在当前大小(名为“image@2x.png”)和一个半尺寸(调整在Photoshop / preview.app的/ etc)(命名为 “image.png”)



文章来源: Texture mapping in GLKit is not working only in devices