0

OpenGL ES 1.0 で 2D ゲームを作成しています (該当する場合は 1.1 拡張機能にキャストします)。明らかな何かを見逃した場合に備えて、これをできるだけ一般的なものにしようとしています。

Android 2.2 (Froyo) と Android 2.3.3 (Gingerbread) の間の深度テストに関して問題があります。現在、onCreateには次のものがあります。

//this is called once only when the renderer is created
gl.glClearDepthf(1.0f);                     
gl.glEnable(GL10.GL_DEPTH_TEST);            
gl.glDepthFunc(GL10.GL_LEQUAL); 
gl.glMatrixMode(GL10.GL_PROJECTION); 
gl.glLoadIdentity();                    
gl.glOrthof(0, mWidth, 0, mHeight, 1.0f, 320.0f);

OES_draw_texture拡張機能を使用すると、深度バッファーを正常に使用できますが、これは問題ではありません。ただし、頂点の従来の描画に Z 値を指定すると、バージョン間で奇妙な不一致が発生します。

2.2 では、次のコードが前面 (一番上) にレンダリングされます。

//This array is used in the function glDrawArrays as a GL10.GL_TRIANGLE_STRIP.
//It works as intended. The specific positions are the Z positions of each point in
//the square (the triangle strips form a square).
vertices[2]=0.5f*(1+320)*-1; 
vertices[5]=0.5f*(1+320)*-1; 
vertices[8]=0.5f*(1+320)*-1; 
vertices[11]=0.5f*(1+320)*-1; 

これで問題なく動作しますが、2.3.3 ではオブジェクトがさらに後方に押し出されます。2.3.3 を使用して正しい位置を取得するには、次の手順を実行する必要があります。

vertices[2]=-1; 
vertices[5]=-1; 
vertices[8]=-1; 
vertices[11]=-1; 

これにより、問題が修正されます。

私の質問は 2 つあります。

  • 深度バッファを 1 ~ 320 に指定したのに、Z 値を +ve ではなく -ve と指定しなければならないのはなぜですか? 標準の (非 ES ではありますが)ドキュメントには、zNear と zFar を -ve または 0 にすべきではないと明確に記載されています。
  • このように 2.2 と 2.3.3 の間に相違があるのはなぜですか? 私は、2.3.3 が近い値として 1 を持つことによって「正しい」方法でそれを行っているという印象を受けています。これは私が期待したものです。では、深度バッファの半分が事実上無視されるのはなぜですか?

Gingerbread が暗黙のうちに想定している特定のコマンドが欠落している可能性があると思いますが、Froyo はそうではありませんが、確信が持てません。どんな助けでも大歓迎です。

4

1 に答える 1

0

gl.glOrthof は ES 2.0 では効果がありません。射影行列の概念がなくなったためです。おそらく、android.opengl.Matrix.orthoM を使用して射影行列を計算し、頂点シェーダーでポイントを乗算する必要があります。次のようにします。

attribute vec3 position;
uniform mat4 projection;
void main() {
    gl_Position = projection * vec4(position, 1.);
}

gl_Position に割り当てられた位置は「クリップ座標」であり、各次元で -1..1 の範囲にあります。必要なzNear..zFarから-1..1にスケーリングせずに、頂点データからgl_Positionを割り当てているようです。

于 2011-09-12T23:10:36.310 に答える