0



これは、AndroidプラットフォームでOpenGLES2.0を使用してモバイルアプリケーションを開発しています(API 8に対して、違いがある場合)。

現在機能しているレンダリングシステムにUIレイヤーを追加しようとしていますが、機能しておらず、理由がわかりません。どんな助けでも大歓迎です。

私が行っていることは次のとおりです
。1)初期化するときに、さまざまなプログラムを使用してレンダリングする、表示するメッシュのヒープ全体をロードします。メッシュの1つにテクスチャが表示され、これが機能しています。
2)すべてのメッシュをロードした後、上記の(1)ですでに使用されているのと同じテクスチャの正方形である「ボタン」をロードします。
3)私のメインのレンダリングループは、深度マスクを書き込み可能にし、プログラムごとに不透明なものをレンダリングし、次に深度マスクを読み取り専用にし、プログラムごとに、任意の程度の透明度を持つものをレンダリングします。次に、深度バッファビットをクリアし、各UIコンポーネントを順番にレンダリングします。

私は、おそらく正しい方法ではないことを1つ実行しています。つまり、UIコンポーネントをレンダリングしているプログラムは、モデル-ビュー-プロジェクション変換を実行していません。正規化されたデバイス座標を直接渡しています。パススルー。私の知る限り、これはうまくいくはずです-私はそれを疑っているので、私はそれについて言及するだけです。UIコンポーネントプログラムの頂点シェーダーとフラグメントシェーダーのコードは次のとおりです。
int vShader = compileShader(GLES20.GL_VERTEX_SHADER,
"attribute vec4 aPosition;" +
"attribute vec2 aTexCoord;" +
"varying vec2 vTexCoord;" +
"void main() {" +
" vTexCoord = aTexCoord;" +
" gl_Position = aPosition;" +
"}");
int fShader = compileShader(GLES20.GL_FRAGMENT_SHADER,
"precision mediump float;" +
"uniform sampler2D uTexture;" +
"varying vec2 vTexCoord;" +
"void main() {" +
" gl_FragColor = texture2D(uTexture,vTexCoord);" +
"}");


これが私が試したことです:
1)不透明で透明なプログラムが実行されないようにしようとしました。この場合、画面がゴミで完全にいっぱいになります(縞模様の規則的な間隔の水平方向のストライプ、純粋な黒と一見ランダムなものが交互に表示されます-各バンドの高さはおそらく約50ピクセルです)。
2)ベースとなるfloat配列の内容をFloatBuffer調べました(直接調べる方法がわかりFloatBufferません。すべてが良さそうです。

少し困惑しています。誰かアイデアはありますか?

4

1 に答える 1

0

わかりました、私はこれの底に着きました。誰かが再びここにたどり着いた場合に備えて、最初に確認する一般的な事項をリストし、次に正確に私の被害が何であったかをリストします.

一般的に:
1) 何かが表示されない場合は、カリング フェイス ( glDisable(GL_CULL_FACE)) をオフにします。このように、ポリゴンの利き手を間違った方向に持っていても、何かが見えます。
2) OpenGL の 0,0 が左下であることに注意してください。ただし、UI コードでは 0,0 が左上であると判断した可能性があります (これは、三角形に間違った利き手を与えるのに役立ち、助長する可能性があります)。 ここでポイント 13 は、これを回避する方法を示しています。
3) 画面にゴミが表示される場合は、バッファをクリアするのを忘れている可能性があります。

つまり、具体的には、(UI コードと OpenGL コードのオリジンが一致しないため) いくつかの三角形が間違った方向に回り、デバッグのために基本に戻ってプルーニングを開始するときに、glClear を誤ってコメントアウトしていました。電話。

直交コードの行列変換を行うことができないかどうかについては、そうすべきだと思いますが、報告できません。物事を基本に戻すということは、そのコードがなくなったことを意味し、一度それを機能させたら、元に戻すつもりはありませんでした!

于 2013-03-18T06:44:12.743 に答える