1

OpenGL ES と GLKit を使用して、このようなものを描画しようとしています

ここに画像の説明を入力

しかし、私はこれを取得しています

ここに画像の説明を入力

テクスチャは透明ですが、モデルの上位レイヤは、ブレンドする代わりに下位のテクスチャを置き換えます。どうにかして修正することは可能ですか?

- (void)setup {

    self.effect = [[GLKBaseEffect alloc] init];

    NSURL *textureURL = [[NSBundle mainBundle] URLForResource:@"portalTexture_ALIENS" withExtension:@"png"];
    texture = [GLKTextureLoader textureWithContentsOfURL:textureURL options:nil error:nil];

    if (texture != nil) {
        self.effect.texture2d0.enabled = GL_TRUE;
        self.effect.texture2d0.envMode = GLKTextureEnvModeReplace;
        self.effect.texture2d0.target = GLKTextureTarget2D;
        self.effect.texture2d0.name = texture.name;
    }

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, texturedPortalVerts);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, texturedPortalTexCoords);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

}

- (void)draw {
    [self.effect prepareToDraw];
    glDrawArrays(GL_TRIANGLES, 0, texturedPortalNumVerts);
}

ありがとうございました。

4

1 に答える 1

2

OpenGL の透明度は順序に依存します。アルゴリズムは順序に依存しない透過性のために存在しますが、かなり複雑で、いくつかの重大な妥協点があります。ただし、あなたの場合、アルファテストを使用してこの問題の大部分を解決できます。アルファ テストでは、アルファが特定のしきい値 (この例では空のスペース) を下回るピクセルは無視されます。glAlphaFunc の正確な使用法については、Google で検索してください。

OpenGL ES 2.0 ビルトイン アルファ テストを使用している場合、シェーダーに実装する必要があります。次のようになります。

if (texture.alpha < 0.5)
{
    discard;
}

アルファ テストでは、フィル レートのパフォーマンスが大幅に低下する可能性があることに注意してください。

于 2013-06-09T16:35:43.920 に答える