【问题标题】:Opengl shader compatibility with opengl es 2.0Opengl 着色器与 opengl es 2.0 的兼容性
【发布时间】:2016-08-14 03:25:18
【问题描述】:

我使用 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

编译正常,运行正常, 1.这是什么原因? 另一个问题: 2.我还能在linux和android上运行这个shader吗? 我正在使用 linux 现在一切运行良好。 谢谢

【问题讨论】:

标签: opengl shader sdl


【解决方案1】:

那是什么原因?

仅 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 版本。

【讨论】:

  • 这并不完全正确。从 GLSL 1.30 版本开始,桌面 OpenGL 支持精度限定符。
  • @RetoKoradi:它们在桌面 OpenGL 中没有功能。您当然可以使用忽略它们的 GLSL 版本,但它们不会做任何事情。请参阅此处:stackoverflow.com/a/20131165/1907004 我已更新我的答案以包含您的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多