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つの疑わしい部分があります。

    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

スクリーンショットを見ると...問題はiPhoneからiPadに移行することなのかしら?

すなわち、網膜から非網膜へ?

画像の読み込みでRetinaスケールが無視されている可能性があるため、iPadではテクスチャマップが「2倍大きすぎる」ように見えます。

Appleの方法(私の別の答え)を使用すると、それは自動的に修正されますが、そうでない場合は、現在のサイズ( "image@2x.png"という名前)と半分のサイズ(フォトショップでサイズ変更)の2つの画像のコピーを作成してみてください。 /review.app/など)(「image.png」という名前)

于 2013-04-02T12:25:27.070 に答える
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);
}

mtl2openglすぐにGitHubのプロジェクト用に変更します...

于 2013-04-16T20:00:11.517 に答える