これは、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
ません。すべてが良さそうです。
少し困惑しています。誰かアイデアはありますか?