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

时间:2016-08-14 03:25:19

标签: 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 );

然后我在互联网上找到了一些简单的漫反射着色器:

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现在一切运行良好。 感谢

1 个答案:

答案 0 :(得分:2)

  

原因是什么?

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

  

我还可以在linux和android上运行这个着色器吗?

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

OpenGL ES 2.0OpenGL 2.0不同。

有关更多信息,请参见此处:
https://stackoverflow.com/a/10390965/1907004

修改
正如其他人所指出的:您可以在桌面OpenGL中使用精度限定符,但编译器会忽略它们。见这里:
https://stackoverflow.com/a/20131165/1907004
要使其正常工作,您需要使用#version XXX为您的着色器指定一个GLSL版本,您似乎缺少该版本。无论您做什么,都应该始终指定着色器的GLSL版本。