2

HTC Desire S で GLES2.0 を使用するアプリを作成しました。HTC では動作しますが、Samung Galaxy tab10.1 では動作しません。プログラムをリンクできません (GLES20.glGetProgramiv(mProgram, GLES20.GL_LINK_STATUS, linOk,0) は -1 を返します)、glGetError() はエラー 1282 (無効な操作) を返します。

この行を (シェーダーで) 置き換えると:

graph_coord.z = (texture2D(mytexture, graph_coord.xy / 2.0 + 0.5).r);

graph_coord.z = 0.2;

銀河タブでも機能します。私のシェーダーは次のようになります。

 private final String vertexShaderCode =
"attribute vec2 coord2d;" +
"varying vec4 graph_coord;" +
"uniform mat4 texture_transform;" + 
"uniform mat4 vertex_transform;" +
"uniform sampler2D mytexture;" +
"void main(void) {" +
"  graph_coord = texture_transform * vec4(coord2d, 0, 1);" +
"  graph_coord.z = (texture2D(mytexture, graph_coord.xy / 2.0 + 0.5).r);" + 
"  gl_Position = vertex_transform * vec4(coord2d, graph_coord.z, 1);" + 
"}";

シェーダーがアタッチされている場所です。

  mProgram = GLES20.glCreateProgram();             // create empty OpenGL Program
  GLES20.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
  GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
  GLES20.glLinkProgram(mProgram);                  // create OpenGL program executables
  int linOk[] = new int[1];
  GLES20.glGetProgramiv(mProgram, GLES20.GL_LINK_STATUS, linOk,0);

そして、テクスチャはここにロードされます:

 GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture_id[0]);
 GLES20.glTexImage2D(
        GLES20.GL_TEXTURE_2D,   // target
    0,                  // level, 0 = base, no minimap,
    GLES20.GL_LUMINANCE,       // internalformat
    size,                  // width
    size,                  // height
    0,                  // border, always 0 in OpenGL ES
    GLES20.GL_LUMINANCE,       // format
    GLES20.GL_UNSIGNED_BYTE,   // type
    values
 );
4

2 に答える 2

2

これは Nvidia Tegra GPU の制限のようです。Tegra 3 GPU でエラーを再現できました。頂点シェーダーでのテクスチャ ルックアップは、理論上は OpenGL ES 2.0 の一部ですが、Nvidia によると、Tegra の頂点シェーダー テクスチャ ユニット ( GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS) の数は 0 です ( PDF: Tegra プラットフォーム用の OpenGL ES 2.0 開発)。

于 2012-07-10T08:48:00.553 に答える
-1

頂点シェーダーでテクスチャ ルックアップを作成するtexture2DLod()代わりに使用する必要があります。texture2D()

GLSL 仕様、セクション8.7 テクスチャ ルックアップ関数: http://www.khronos.org/files/opengles_shading_language.pdf

于 2013-01-24T13:55:09.887 に答える