Opengl着色器与Opengl es 2.0的兼容性
我用sdl 2.0创建了一个应用程序,并用2.0版初始化了opengl,如下所示: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_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版本,但它们不会做任何事情。请参阅此处:我已经升级了我的回答中包括了你的信息。