【问题标题】:OpenGL/GLSL precision errorOpenGL/GLSL 精度错误
【发布时间】:2014-07-18 09:07:00
【问题描述】:

我有一个简单的顶点着色器:

precision mediump float;

attribute vec4 position;

attribute vec4 color;
varying vec4 f_color;

uniform mat4 projection;
uniform mat4 modelView;

void main(void) {
    gl_Position = projection * modelView * position;
    f_color = color;
    f_texCoord = texCoord;
}

编译失败,说明(使用 getShaderInfoLog()):

ERROR: 0:1: 'precision' : syntax error syntax error

如果我删除带有精度说明符的行,它编译得很好。

系统:

OS: Mac OX 10.9.2 
GPU: NVIDIA GeForce 320M 256 MB
GLSL Ver.: 1.20

谁来帮帮我。

【问题讨论】:

  • OpenGL 和 GLSL 的版本是多少?自 GLSL 1.30 (OpenGL 3.0) 起,以下限定符已被弃用,并从 GLSL 1.40 及更高版本中删除。
  • @SAKrisT 我在标题中看到 gl3 所以我猜这是 OpenGL 3.0。有没有办法识别版本?抱歉,我是新手。
  • const GLubyte *v = glGetString(GL_SHADING_LANGUAGE_VERSION); NSLog(@"GLSL version %s", v);
  • @SAKrisT 谢谢。它的版本 1.20。更新了我的问题。

标签: macos opengl macros glsl


【解决方案1】:

您已经想出了解决问题的方法:只需删除带有精度限定符的行。

更大的问题是你还没有决定你使用的是什么版本的 OpenGL。您提供的 GLSL 示例似乎适用于与 OpenGL ES 相关联的旧版本 GLSL,它是为移动设备设计的。由于您实际上是在台式机/笔记本电脑上运行,因此您需要“普通” OpenGL。您观察到的错误是两者之间差异的结果。

通常,您希望使用目标系统支持的最新版本的 OpenGL。现在可能是 OpenGL 3.3(以及 GLSL 3.3)。

【讨论】:

    【解决方案2】:

    precision 关键字是 OpenGL/ES 扩展。由于您的顶点着色器中没有#version,因此您将获得不支持此类 GL/ES 扩展的 GLSL v1.1(向后兼容 OpenGL2.0)。

    要么删除precision 行(无论如何它在桌面GL 上可能什么都不做),或者为支持precision 的某些版本的GLSL 添加#version

    【讨论】:

    • 我正在使用的着色器是来自 OpenGL ES 项目的着色器。那么桌面上的“precision”关键字是多余的吗?我需要指定 OpenGL GLSL 的版本吗?
    • @Alterecho 是的,它是多余的。看我的回答。
    【解决方案3】:

    OpenGL 3.3 中的精度限定符是多余的。在 OpenGL 3.3 规范中,“添加精确限定符是为了在 OpenGL ES 中实现代码可移植性,不是为了功能。它们与 OpenGL ES 中的语法相同,如下所述,但它们没有语义,其中包括对用于存储或操作变量的精度没有影响

    使用 #version 330 core 用于严格的 3.3,没有向后兼容性。如果您不需要 ES 兼容性,则丢失精度限定符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 2011-07-18
      • 2014-11-07
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多