3

私のアプリ ( Tres ) では、画像ピッカーから画像を読み込んでテクスチャに配置しています。すべてのテストで問題なく動作しましたが、Retina ディスプレイを搭載した iPad を使用しているオンライン ユーザーは、画像が黒くなると不満を漏らしています。

GL_MAX_TEXTURE_SIZE を調べて、画像がそれより大きくないことを確認しています。

ここでテクスチャをセットアップします。

texture_aspect = image.size.width / image.size.height;
CGFloat side = image.size.width;

if(side>GL_MAX_TEXTURE_SIZE)
    side = GL_MAX_TEXTURE_SIZE;
UIImage *newImage = [ImageUtils imageWithImage:image scaledToSize:CGSizeMake(side, side)];

image_height = 600.0f;
image_width = image_height * texture_aspect;
if(image_width>600.0f) {
    image_width = 900.0f;
    image_height = image_width / texture_aspect;
}

NSError* error;
GLKTextureInfo * texture = [GLKTextureLoader textureWithCGImage:newImage.CGImage options:nil error:&error];
if (error) {
    NSLog(@"Error loading texture from image: %@",error);
}

そして、これが私が画像を描く方法です:

- (void) dibujaFoto {
    self.effect.texture2d0.enabled = GL_TRUE;
    [self.effect prepareToDraw];
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);

    GLfloat squareVertices[] = {
        -image_width/2, -image_height/2,
        image_width/2,-image_height/2,
        -image_width/2, image_height/2,
        image_width/2,image_height/2,
    };

    const GLfloat squareTextureCoords[] = {
        0.0, 1.0,
        1.0, 1.0,
        0.0, 0.0,
        1.0, 0.0,
    };

    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, squareVertices);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, squareTextureCoords);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glDisableVertexAttribArray(GLKVertexAttribPosition);
    glDisableVertexAttribArray(GLKVertexAttribTexCoord0);
    self.effect.texture2d0.enabled = GL_FALSE;
}

画像の大きさに関係なく、常に第 2 世代の iPad で動作しますが、Retina ディスプレイではこのコードに問題があるようです。

4

1 に答える 1

5

1 つには、実際には最大テクスチャ サイズを読み取っていません。GL_MAX_TEXTURE_SIZE は、デバイスの最大テクスチャ サイズを表すのではなく、最大テクスチャ サイズを読み取るときに使用される OpenGL ES 定数です。

実際の最大テクスチャ サイズを読み取るには、次のようなものを使用する必要があります。

static GLint maxTextureSize = 0;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);

もちろん、EAGLContext をセットアップして最新の状態にした後で、これを実行する必要があります。

古いデバイス (iPhone 4S より前) のテクスチャの最大サイズはすべて 2048x2048 でした。A5 以上のデバイス (4S 以降) の最大テクスチャ サイズは 4096x4096 です。

ただし、私の SDK の GL_MAX_TEXTURE_SIZE 定数は 10 進数で 3379 に変換されるため、これは Retina iPad の最大テクスチャ サイズ 4096x4096 に十分収まるはずです (ただし、iPad の元のモデルには大きすぎます)。古いデバイスではなく、これらのデバイスでこれが失敗する理由がわかりません。ImageUtils クラスがデバイス スケール ファクターを間違った方法で適用している可能性はありますか?

于 2013-05-28T14:30:45.000 に答える