Iphone GLKit中的纹理映射不仅在设备中有效

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

我使用中的代码映射人脸的纹理。此代码使用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));
}
模拟器图像:

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

有什么我遗漏的吗

  • 使用苹果内置的1行方法加载——不要编写自己的(坏的)实现

    :


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

    2.1。摆脱这一行:

    glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性)

    2.2。这一行使用了一个超出范围的编号,这不是很好:

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

  • 看看截图。。。我想知道问题是否在于你正在从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。我会尽力尽快给你回复。非常感谢\