Nexus 4 で開発したゲームを作成していますが、問題なく動作します。Sony の Xperia U でテストしたところ、(この問題については) 問題なく動作しました。ただし、問題は欲望 S (同じコード) にあります。
実際のゲームプレイを開始すると、このバックグラウンド テクスチャをレンダリングする必要がありますが、1 秒ほどの間、間違ったテクスチャが使用されます。効果を見る:
銘柄スワップのイメージ:
左の写真は何がうまくいかないか、右の写真はあるべき姿です (正確に同じ時間ではありませんが、私の問題を視覚化するためのものです)。
GLES20.GL_TEXTURE0 を取得する必要がある場所で、GLES20.GL_TEXTURE4 に割り当てられているテクスチャを取得します。
コードに進む前に、ゲームプレイ中に同じことが起こります。パーティクルがレンダリングされるたびに、テキスト (テクスチャも) が別のテクスチャと交換されます。パーティクルがなくなった瞬間、テキストは再び正しくレンダリングされます。
銘柄スワップのイメージ:
この例では、背景を保持するテクスチャを使用しているように見えますが、ランダムです。これは、文字だけを見たことを覚えているが、背景が黒で透明度がないことを覚えているためです。パーティクルとテキスト エンジンは同じ ShaderProgram を使用しますが、背景は使用しませんが、完全を期すために、私のシェーダーは次のようになります。
public static final String vertexShaderCodeTC =
"uniform mat4 uMVPMatrix;" +
"attribute vec4 vPosition;" +
"attribute vec4 a_Color;" +
"attribute vec2 a_texCoord;" +
"varying vec4 v_Color;" +
"varying vec2 v_texCoord;" +
"void main() {" +
" gl_Position = uMVPMatrix * vPosition;" +
" v_texCoord = a_texCoord;" +
" v_Color = a_Color;" +
"}";
public static final String fragmentShaderCodeTC =
"precision mediump float;" +
"varying vec4 v_Color;" +
"varying vec2 v_texCoord;" +
"uniform sampler2D s_texture;" +
"void main() {" +
" gl_FragColor = texture2D( s_texture, v_texCoord ) * v_Color;" +
" gl_FragColor.rgb *= v_Color.a;" +
"}";
ここに私のレンダリングコードがあります:
int mPositionHandle = GLES20.glGetAttribLocation(riGraphicTools.ShaderProgram, "vPosition");
riGlobal.checkGlError("glGetAttribLocation | vposition |");
// Enable a handle to the triangle vertices
GLES20.glEnableVertexAttribArray(mPositionHandle);
riGlobal.checkGlError("glEnableVertexAttribArray");
// Prepare the background coordinate data
GLES20.glVertexAttribPointer(mPositionHandle, 3,
GLES20.GL_FLOAT, false,
0, vertexBuffer);
riGlobal.checkGlError("glVertexAttribPointer");
int mTexCoordLoc = GLES20.glGetAttribLocation(riGraphicTools.ShaderProgram, "a_texCoord" );
riGlobal.checkGlError("glGetAttribLocation | a_texCoord");
// Prepare the texturecoordinates
GLES20.glVertexAttribPointer ( mTexCoordLoc, 2, GLES20.GL_FLOAT,
false,
0, textureBuffer);
riGlobal.checkGlError("glVertexAttribPointer");
GLES20.glEnableVertexAttribArray ( mPositionHandle );
riGlobal.checkGlError("glEnableVertexAttribArray");
GLES20.glEnableVertexAttribArray ( mTexCoordLoc );
riGlobal.checkGlError("glEnableVertexAttribArray");
// get handle to shape's transformation matrix
int mtrxhandle = GLES20.glGetUniformLocation(riGraphicTools.ShaderProgram, "uMVPMatrix");
riGlobal.checkGlError("glGetUniformLocation");
// Apply the projection and view transformation
GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);
riGlobal.checkGlError("glUniformMatrix4fv");
int mSamplerLoc = GLES20.glGetUniformLocation (riGraphicTools.ShaderProgram, "s_texture" );
riGlobal.checkGlError("glGetUniformLocation");
// Set the sampler texture unit to 0
GLES20.glUniform1i ( mSamplerLoc, riGlobal.get().getThemeStateOne());
riGlobal.checkGlError("glUniform1i");
// Draw the triangle
GLES20.glDrawElements(GLES20.GL_TRIANGLES, GameBackground.indices.length,
GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
riGlobal.checkGlError("glDrawElements");
// Disable vertex array
GLES20.glDisableVertexAttribArray(mPositionHandle);
riGlobal.checkGlError("glDisableVertexAttribArray");
GLES20.glDisableVertexAttribArray(mTexCoordLoc);
riGlobal.checkGlError("glDisableVertexAttribArray");
デバッグすると、themestate 関数が正しいテクスチャ値を返すため、背景をレンダリングする必要があります (他のすべてのデバイスと同様) が、Desire S ではなぜかレンダリングされません。
これはおそらくあなたが必要とするすべてのコードではありませんが、私はあなたが必要とするものを正確には知りません.私のアプリ全体を投稿するのはやややり過ぎのようです.
述べたように複数のデバイスでこれをテストしたので、実際にはDesire Sのみ、またはDesire Sにのみ影響するいくつかの構成/設定のようですが、何を見つけることができないようです.それは再び正しくレンダリングされますか?
PS私が見るロジックは、開始時(およびその点については終了時)に赤いブロック(効果)をレンダリングすると、その赤いブロックテクスチャで三角形をレンダリングしなくなるとすぐに、背景テクスチャを何らかの形で交換することです。背景再び正しくレンダリングされます。同じことがパーティクルにも見られ、それらをレンダリングするとテキストが台無しになります。ここで奇妙なことに、パーティクル テクスチャは背景と同じテクスチャ上にあるため、パーティクルがないゲームプレイ中は、すでにそのテクスチャから描画されています。
また、ゲーム/メニュー/パーツなどのすべての部分で、これら 2 つの場所/インスタンスでのみ発生します。