0

概要

いくつかの画像とグラデーションを組み合わせて、ゲーム内にグラフィックを構築しようとしています。Core Graphics を使用することから始めました。これは素晴らしく機能しましたが、非常に遅かったです。GLKit を使用して OpenGL に移植しようとしましたが、非常に近いですが、最後の問題が 1 つあります。

画面上の三角形にテクスチャを描画しました。その上に、グラデーションを描きたいと思います。グラデーションを描くには、2 つの頂点を黒色、3 つ目の頂点を完全に透明 (アルファ = 0) にする三角形を描くのが最も簡単だと考えました。グラデーションはそれ自体で適切にレンダリングされますが、テクスチャの上にレンダリングされると、テクスチャのアルファも影響を受けているように見え、背景が透けて見えます。

私が欲しいもの:

ここに画像の説明を入力

代わりに得られるもの:

ここに画像の説明を入力

私は OpenGL や GLKit にあまり詳しくないことを認めます。三角形のすべての点でのテクスチャのアルファは (1 - グラデーション アルファ) であり、テクスチャがコーナーで完全に不透明である理由と、テクスチャとグラデーションの両方が中央で部分的に透明に見える理由を説明していると思います。

GLKit でやりたいことを実現できますか? それは GLKit と GLKBaseEffect にも関係していますか、それともオフにすることができる OpenGL でファンキーなマルチテクスチャ処理を行っているだけですか?

コード スニペット

テクスチャを描画するために、スプライト クラスのレンダリング関数:

typedef struct {
    CGPoint geometryVertex;
    CGPoint textureVertex;
} TexturedVertex;

- (void)renderTriangleStrip:(TexturedVertex *)coordinates ofSize:(NSInteger)size {
    self.effect.texture2d0.envMode = GLKTextureEnvModeReplace;
    self.effect.texture2d0.name = self.textureInfo.name;
    self.effect.texture2d0.enabled = YES;

    self.effect.transform.modelviewMatrix = self.transform;

    [self.effect prepareToDraw];

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);

    long offset = (long)coordinates;        
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex)));
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex)));

    glDrawArrays(GL_TRIANGLE_STRIP, 0, size);

    glDisableVertexAttribArray(GLKVertexAttribPosition);
    glDisableVertexAttribArray(GLKVertexAttribTexCoord0);
}

グラデーション付きの三角形を描画するための、私の形状クラスのレンダリング関数:

typedef struct {
    CGPoint position;
    GLKVector4 color;
} ColoredVertex;

- (void)renderVertices:(ColoredVertex *)vertices ofSize:(NSInteger)size {
    self.effect.texture2d0.envMode = GLKTextureEnvModeDecal;
    self.effect.texture2d0.enabled = NO;

    self.effect.useConstantColor = NO;

    self.effect.transform.modelviewMatrix = self.transform;

    [self.effect prepareToDraw];

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribColor);

    long offset = (long)vertices;
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ColoredVertex), (void *) (offset + offsetof(ColoredVertex, position)));
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(ColoredVertex), (void *) (offset + offsetof(ColoredVertex, color)));

    glDrawArrays(GL_TRIANGLE_FAN, 0, size);

    glDisableVertexAttribArray(GLKVertexAttribPosition);
    glDisableVertexAttribArray(GLKVertexAttribColor);
}

よろしくお願いします。

編集: glBlendFunc(...) には私の答えが含まれているようです。しかし、私はさまざまなモードを理解していません。私はここで正しい軌道に乗っていますか?

編集:まだ解決策はありませんが、質問の仮定を更新しました。

4

1 に答える 1

1

私はあなたの問題を理解しているかどうか確信が持てないので、私が理解しているようにそれを再表明しようとします.

  1. あなたはチェッカーの背景を描きます
  2. ノイズの多いテクスチャで不透明な三角形のテクスチャを描画します
  3. 色のグラデーションで三角形を描き、その下の色に影響を与えます。

問題が発生するのはパス 3 であることを理解しています。

この場合、参照画像を取得するために必要なことは、適切なブレンド モードと適切な頂点カラーを使用してグラデーション三角形を描画することです。あなたの場合、2 つの黒の色と 1 つの白の色です。

あなたの場合、ブレンディングは次を使用してセットアップされます:

glEnable(GL_BLEND);
glBlendFunc(GL_ZERO, GL_SRC_COLOR);

これにより、OpenGL が三角形を描画するように指示されるため、結果のピクセルの色は で与えられdst = 0 * src + src * dstますdst = dst * src

于 2012-06-16T22:11:55.943 に答える