顶点着色器无法在Galaxy Tab10(Tegra 2)上运行



我在HTC Desire S上创建了一个使用GLES2.0的应用程序。它适用于HTC,但不适用于Samung Galaxy tab10.1。无法链接程序(GLES20.glGetProgramiv(mProgram,GLES20.GL_LINK_STATUS,linOk,0)gives-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
 );

这似乎是英伟达Tegra GPU的限制。我能够在Tegra 3 GPU上重现错误。尽管顶点着色器中的纹理查找理论上是OpenGL ES 2.0的一部分,但根据Nvidia的说法,Tegra的顶点着色器纹理单元(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS)的数量为0(PDF:OpenGL ES 2.0 Tegra平台开发)。

必须使用texture2DLod()而不是texture2D()在顶点着色器中进行纹理查找。

GLSL规范,章节8.7纹理查找函数:http://www.khronos.org/files/opengles_shading_language.pdf

相关内容

  • 没有找到相关文章

最新更新