【发布时间】:2014-08-20 10:47:29
【问题描述】:
应用在 Nexus 7 和 Nexus 5 上编译着色器失败,但在 Galaxy s3 上一切正常。 这是未编译的着色器。
#define FRAGMENT_SHADER
#ifdef VERTEX_SHADER
void main()
{
gl_Position = vec4( atbCoord.x, atbCoord.y, 0.0, 1.0 );
}
#endif
#ifdef FRAGMENT_SHADER
void main()
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
#endif
我正在使用 GLSurfaceView 和 OpenGL ES 2。
这个着色器有什么问题?
【问题讨论】:
-
你确定这是完整的代码吗?
atbCoord在哪里声明?你得到什么错误?此外,根据 ES 2.0 GLSL 规范的4.5.3 Default Precision Qualifiers段,您必须为片段着色器指定默认的float精度。一些 OpenGL ES 驱动程序经常忽略此要求 - 有些可能会编译此类无效着色器,有些可能会失败。规范链接:khronos.org/files/opengles_shading_language.pdf -
在一台设备上编译代码但在另一台设备上编译的情况并不少见。正如@keaukraine 所指出的,这通常是因为一个设备过于宽松,接受了不应允许的代码。
-
这是我在运行时从代码生成的没有声明和定义精度的代码的一部分。我已经找到了问题所在。 Nexus 7 和 Nexus 5 GPU 着色器编译器失败,如果在源代码的最后一行你有 #endif 后面没有任何换行符('\n')。
标签: android android-ndk glsl opengl-es-2.0