概要
いくつかの画像とグラデーションを組み合わせて、ゲーム内にグラフィックを構築しようとしています。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(...) には私の答えが含まれているようです。しかし、私はさまざまなモードを理解していません。私はここで正しい軌道に乗っていますか?
編集:まだ解決策はありませんが、質問の仮定を更新しました。