2

注:このコードを作業フォームに更新し、回答で試みたすべてを提供しました。うまくいけば、同じ問題を抱えている他の誰かに役立ちます。

テクスチャが黒く表示されています (つまり、テクスチャがありません)。ここで同じ問題について他のいくつかの質問をしましたが、解決策が見つかりませんでした。非常に単純なもの(おそらく注文)が欠けていると確信していますが、それを理解することはできません。

テクスチャを次のようにセットアップします (GLProgram.checkError は GL エラーをチェックしてログに記録します。エラーはどこにも表示されません)。

    /*Bitmap*/ bitmap = BitmapFactory.decodeResource( context.getResources(), 
        R.drawable.gears );

    int textures[] = new int[1];
    GLES20.glGenTextures( 1, textures, 0 );
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
    GLProgram.checkError( "texImage2D" );

    texture = textures[0];

テクスチャリングする必要がある正方形を描くには、次のようにします。

    GLES20.glVertexAttribPointer(glProgram.hATex, 2, GLES20.GL_FLOAT, false, 
        2*SIZEOF_FLOAT, texBuffer.under);
    GLProgram.checkError( "hATex" );

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0 );
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
    GLES20.glUniform1i(glProgram.hUTex, 0);
    GLProgram.checkError( "Uniform" );

    GLES20.glVertexAttribPointer( glProgram.hAttribPosition, COORDS_PER_VERTEX,
        GLES20.GL_FLOAT, false,
        vertexStride, vertexBuffer.under );
    GLProgram.checkError( "Vertex" );
    GLES20.glDrawArrays( GLES20.GL_TRIANGLE_FAN, 0, vertexBuffer.size/COORDS_PER_VERTEX );
    GLProgram.checkError( "draw" );

私の頂点シェーダーは次のとおりです。

precision mediump float;
attribute vec4 vPosition;
uniform mat4 mTransform;

attribute vec2 aTex;
varying mediump vec2 vTex;

void main() {
  gl_Position = mTransform * vPosition;
  vTex = aTex;
}

私のフラグメントシェーダーは次のとおりです。

precision mediump float;
uniform vec4 vColor;
uniform sampler2D uTex;
varying mediump vec2 vTex;

void main(void)
{
//gl_FragColor = vColor;
//testing vTex, and it is fine
//gl_FragColor = vec4( vTex[0], vTex[1], 0, 1.0 );
//so it must be uTex which is program
    gl_FragColor = texture2D(uTex,vTex);
}

チェックした内容を示すために、コメントを残しました。そのビットが予想される赤/緑のカラー スイープを生成するので、私のvTexパラメーターは正しいです。したがって、テクスチャ自体である必要があると思います。

また、uTex、aTex は次の場所にあります。

    hATex = GLES20.glGetAttribLocation( hProgram, "aTex" );
    checkError( "aTex" );
    hUTex = GLES20.glGetUniformLocation( hProgram, "uTex" );
    checkError( "uTex" );

私のテクスチャは JPG で、サイズは 64x64 です。読み込み直後に確認したところ、正しいサイズで、ピクセルの色が表示されます (ランダムにいくつかをダンプするとゼロではありませんでした)。

4

1 に答える 1

2

提示されているように、コードは機能するようになりました。私は物事を試し、コメントのためにそれを変更しました。以前は機能していなかったため、実際にどの段階で機能し始めたかはわかりません。これが私がプロセスでチェック/ダブルチェックしたもののいくつかです-私はそれがどういうわけかこれらの組み合わせでなければならないと思います:

  1. ソース画像が正方形でサイズが2の累乗であることを確認します
    • 非正方形は、両方の次元で2の累乗である限り機能します
    • 非電力2は、TEXTURE_WRAPがCLAMP_TO_EDGEに設定されている限り機能します
  2. 最小/マグを最も近い値に設定します
  3. セットアップ中および各描画でbindTextureを呼び出します

これらは私が試したものであり、今再試行したものであり、違いはないように見えます(つまり、どちらの方法でも機能します)。

  1. ビットマップoptions.inScaled=falseを使用します(デフォルトオプションを使用すると正常に機能します)
  2. glTexParameter関数の前後にtexImage2dを配置します
  3. vTexからmediumpを追加/削除します(おそらくデフォルトのため、不一致は正常に機能します)
  4. glEnableVertexAttribArrayを呼び出さない(これは白いボックスになるので、私の問題ではありませんでした)
  5. 頂点とテクスチャ座標の順序を変更します(他のことが正しくなると、すべての順序が機能します。テクスチャが歪んでいる可能性がありますが、表示されます)
  6. リソース形式の変更(JPG / PNG)(RGB /グレースケール)
  7. オブジェクト変換行列の変更
  8. TEXTURE_WRAP設定(この場合は不要、なしで機能)

それが機能していなかった場合、エラーはサイレントでした。glGetErrorの呼び出しは正常に返され、glGetProgramInfoLogは空でした。

于 2012-08-09T15:28:23.883 に答える