我在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