私の質問は非常に些細なことだと思います。OpenGL ES 2.0 を使用して単純な 2D シーンを描画しています。
画面全体に広がる背景テクスチャと、画面上の特定の場所に描かれた花の別のテクスチャ (またはスプライトと言うシェル?) があります。
したがって、私がそれを行うことを考えることができる簡単な理由glDrawArrays
は、背景テクスチャの頂点を使用して 1 つと、花のテクスチャの頂点を使用して 2 回呼び出すことです。
それは正しい方法ですか?もしそうなら、それは10個の花のためにglDrawArrays
10回呼び出す必要があるということですか?
そして、ブレンドはどうですか?花を背景とブレンドしたい場合、背景と花のピクセル色の両方が必要ですが、2 つの描画で問題になる可能性があります。
それとも1回の抽選で可能ですか?もしそうなら、背景テクスチャ頂点または花のテクスチャ頂点を処理しているかどうかを知るシェーダーを作成するにはどうすればよいですか?
それとも1回の抽選で可能ですか?
1 回の描画の問題は、現在の頂点が背景の頂点 (背景テクスチャの色を使用するよりも) であるか、花の頂点 (花のテクスチャの色を使用するよりも) であるかをシェーダーが知る必要があり、その方法がわからないことです。それ。
ここでは、1 つの描画呼び出しを使用して背景画像を描画し、画面全体に引き延ばし、花を半分のサイズで中央揃えにする方法を示します。
- (void)renderOnce {
//... set program, clear color..
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, backgroundTexture);
glUniform1i(backgroundTextureUniform, 2);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, flowerTexture);
glUniform1i(flowerTextureUniform, 3);
static const GLfloat allVertices[] = {
-1.0f, -1.0f, // background texture coordinates
1.0f, -1.0f, // to draw in whole screen
-1.0f, 1.0f, //
1.0f, 1.0f,
-0.5f, -0.5f, // flower texture coordinates
0.5f, -0.5f, // to draw half screen size
-0.5f, 0.5f, // and centered
0.5f, 0.5f, //
};
// both background and flower texture coords use the whole texture
static const GLfloat backgroundTextureCoordinates[] = {
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
};
static const GLfloat flowerTextureCoordinates[] = {
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
};
glVertexAttribPointer(positionAttribute, 2, GL_FLOAT, 0, 0, allVertices);
glVertexAttribPointer(backgroundTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, backgroundTextureCoordinates);
glVertexAttribPointer(flowerTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, flowerTextureCoordinates);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}