OpenGL ES 2.0:2Dプロジェクションのセットアップ


15

この記事では、一般的に、固定機能パイプラインを使用してシャープなOpenGL 2Dグラフィックスを描画する方法について説明します。

OpenGL ES 2.0には使用できないES 1.x関数(glOrtho()など)があるため、それらの機能はフラグメント/頂点シェーダーで置き換える必要があります。

私の質問は、プログラム可能な関数パイプラインで次の2D投影を設定する方法ですか?

const XSize = 640, YSize = 480
glMatrixMode (GL_PROJECTION)
glLoadIdentity ();
glOrtho (0, XSize, YSize, 0, 0, 1)
glMatrixMode (GL_MODELVIEW)

上記の固定機能2D投影設定を完全に置き換えるために、フラグメントシェーダーと頂点シェーダーをどのように構成する必要がありますか?

回答:


12

OpenGL ES 2.Xエンジンでは、CPU側でMVPマトリックス(モデルビュー投影)を計算し、頂点シェーダーに注入します。

直交射影は4 * 4行列です。MVPを取得したら、次のようにして頂点シェーダーに注入します。

 mMvpLoc = getUniformLocation("uMvp");
 glUniformMatrix4fv(mMvpLoc, 1, false, mMvp.pointer());

mMvpはCPU側の私のマトリックス4 * 4です。getUniformLocationは、プログラムシェーダーを読み込んだ後、1​​回だけ実行できます。

頂点シェーダーの例:

uniform mat4    uMvp;
attribute vec3 aPosition;
varying vec4 vColor;

void main() {
   vec4 position = vec4(aPosition.xyz, 1.);
   gl_Position = uMvp * position;
}

gl_Positionは、事前定義された特別な変数です。頂点の位置が含まれている必要があります。

フラグメントシェーダーの例。描画する各ポイントについて、最終的な色「gl_FragColor」を計算する必要があります。

#ifdef GL_ES
precision highp float;
#endif

void main(void)
{
   gl_FragColor = vColor;
}

このプログラムは、各頂点に定義された色のスムージングで三角形を描きます。

より良いチュートリアルについては、この素晴らしいドキュメントをご覧ください


こんにちはエリス、これは素晴らしい完全な答えです。どうもありがとうございました。よろしく。
文開.Satori

9

glOrtho docから、値を置き換えて:

         2
    ------------       0              0             -1
       XSize
                       2
        0         ------------        0              1
                   - Ysize
        0              0              -2            -1
        0              0              0              1

この行列をユニフォームに保存し、それを着信頂点位置に適用(つまり、M。v積)することができます。


親愛なるバーバル、答えてくれてありがとう。したがって、基本的にES2.0には他に違いはなく、glOrtho()マトリックス置換を手動で作成するだけです。
文海・佐取

@ Bunkai.Satori:まあ、通常、GLはモデルビューと投影の複合体をユニフォームにアップロードします。
バーバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.