Opengl着色器与Opengl es 2.0的兼容性

Opengl着色器与Opengl es 2.0的兼容性,opengl,shader,sdl,Opengl,Shader,Sdl,我用sdl 2.0创建了一个应用程序,并用2.0版初始化了opengl,如下所示: SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MAJOR_VERSION, 2 ); SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MINOR_VERSION, 0 ); error: syntax error, unexpected NEW_IDENTIFIER 然后我在互联网上找到了一些简单的漫反射着色器: attribute highp vec

我用sdl 2.0创建了一个应用程序,并用2.0版初始化了opengl,如下所示:

SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MAJOR_VERSION, 2 );
SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MINOR_VERSION, 0 );
error: syntax error, unexpected NEW_IDENTIFIER
然后我在互联网上找到了一些简单的漫反射着色器:

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);
}
编译失败,错误如下:

SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MAJOR_VERSION, 2 );
SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MINOR_VERSION, 0 );
error: syntax error, unexpected NEW_IDENTIFIER
然后我发现在我移除

highp mediump lowp
它编译良好,运行正常, 1.原因是什么? 另一个问题: 2.我仍然可以在linux和android上运行此着色器吗? 我现在正在使用linux,一切都运行良好。 谢谢

原因是什么

精度限定符仅在OpenGL ES中受支持,在桌面OpenGL中不受支持

我仍然可以在linux和android上运行此着色器吗

没有(至少不是直接的),因为上面解释的原因。您必须制作两个着色器。一个用于桌面OpenGL,一个用于OpenGL ES

opengles2.0
opengl2.0
不同

有关更多信息,请参见此处:

编辑:
正如其他人指出的:您可以在桌面OpenGL中使用精度限定符,但编译器将忽略它们。请参见此处:


为此,您需要使用
#version XXX
为着色器指定GLSL版本,而您似乎缺少该版本。无论您做什么,都应始终指定着色器的GLSL版本。

GL 2.0和GL ES 2.0是不同的。你的着色器是为ES设计的。您可能可以使用广泛支持的(ARB_ES2_兼容性)[如果您使用
#version 100
标记着色器,则扩展。这并不完全正确。从版本GLSL 1.30开始,桌面OpenGL支持精度限定符。@RetoKoradi:它们在桌面OpenGL中没有函数。您当然可以使用忽略它们的GLSL版本,但它们不会做任何事情。请参阅此处:我已经升级了我的回答中包括了你的信息。