我使用sdl 2.0创建了一个应用程序,并使用版本2.0初始化了opengl,如下所示:
SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MAJOR_VERSION, 2 );
SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MINOR_VERSION, 0 );
然后我在互联网上找到了一些简单的漫反射着色器:
attribute highp vec3 inVertex;
attribute mediump vec3 inNormal;
attribute mediump vec2 inTexCoord;
uniform highp mat4 MVPMatrix;
uniform mediump vec3 LightDirection;
varying lowp float LightIntensity;
varying mediump vec2 TexCoord;
void main()
{
//Transform position
gl_Position = MVPMatrix * vec4(inVertex, 1.0);
//Pass through texcoords
TexCoord = inTexCoord;
//Simple diffuse lighting in model space
LightIntensity = dot(inNormal, -LightDirection);
}
无法编译错误,如下所示:
error: syntax error, unexpected NEW_IDENTIFIER
然后我在删除后找到了
highp mediump lowp
它编译得很好并且运行正常, 那是什么原因? 另一个问题: 2.我仍然可以在linux和android上运行这个着色器吗? 我正在使用Linux现在一切运行良好。 感谢
答案 0 :(得分:2)
原因是什么?
精度限定符仅在OpenGL ES中支持,而不在桌面OpenGL中支持。
我还可以在linux和android上运行这个着色器吗?
否(至少不是直接),因为上面解释的原因。你必须制作两个着色器。一个用于桌面OpenGL,另一个用于OpenGL ES。
OpenGL ES 2.0
与OpenGL 2.0
不同。
有关更多信息,请参见此处:
https://stackoverflow.com/a/10390965/1907004
修改强>
正如其他人所指出的:您可以在桌面OpenGL中使用精度限定符,但编译器会忽略它们。见这里:
https://stackoverflow.com/a/20131165/1907004
要使其正常工作,您需要使用#version XXX
为您的着色器指定一个GLSL版本,您似乎缺少该版本。无论您做什么,都应该始终指定着色器的GLSL版本。