在OpenGL ES 2.0/GLSL中,哪里需要精度说明符?

在OpenGL ES 2.0/GLSL中,哪里需要精度说明符?,glsl,opengl-es-2.0,Glsl,Opengl Es 2.0,在等号的右边,将值填充到其中的变量是否决定了使用的精度 例如,此处的精度说明符是否有意义上的差异: gl_FragColor = lowp vec4(1); 下面是另一个例子: lowp float floaty = 1. * 2.; floaty = lowp 1. * lowp 2.; 如果你用一些浮点数,然后用它们创建一个向量或矩阵,那么这个向量或矩阵的精度会达到你填充的值的精度,还是会转换成另一个精度级别 我认为优化这一点最能回答以下问题: dot(gl_LightSource[0]

在等号的右边,将值填充到其中的变量是否决定了使用的精度

例如,此处的精度说明符是否有意义上的差异:

gl_FragColor = lowp vec4(1);
下面是另一个例子:

lowp float floaty = 1. * 2.;
floaty = lowp 1. * lowp 2.;
如果你用一些浮点数,然后用它们创建一个向量或矩阵,那么这个向量或矩阵的精度会达到你填充的值的精度,还是会转换成另一个精度级别

我认为优化这一点最能回答以下问题:

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal)
我的意思是,如果你想尽快实现它,它需要走这么远吗?还是有些东西没用

lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal)
我知道你可以为float定义默认的精度,这应该是用于向量和矩阵之后。为了教育的目的,假设我们之前定义过:

precision highp float;
  • 您不需要常量/文字上的精度说明符,因为这些常量/文字可以在编译时对其赋值

  • 在顶点着色器中,默认情况下声明以下精度:(
    4.5.3默认精度限定符

    在片段着色器中,您可以获得:

    precision mediump int;
    precision lowp sampler2D;
    precision lowp samplerCube;
    
    这意味着如果在片段着色器中声明浮点,则必须说明它是
    lowp
    还是
    mediump
    。默认的
    float
    /
    int
    精度也扩展到矩阵/向量

  • highp
    仅在将
    GL\u FRAGMENT\u PRECISION\u HIGH
    宏定义为
    1
    的系统上受支持;在其他情况下,您将得到一个编译器错误。(
    4.5.4可用精度限定符

  • 表达式精度的规则是,它们会自动转换为绑定到的赋值/参数的类型。因此,对于您的dot,默认情况下,它将使用输入类型的精度,并且不需要额外的
    lowp
    (语法上不正确)。如果要将类型向下转换为较低的精度,唯一的方法是显式地将其指定给较低的精度


  • 这些答案都来自于Khronos GLSL规范,您可以在这里找到(相关章节为4.5.2和4.5.3):

    “此外,由于gl_FragColor的精度已经根据渲染目标的深度定义了”,您对该陈述的来源是什么?我在规范中没有看到任何关于这方面的信息。答案的这一部分是不正确的;这肯定很重要。我已经纠正了答案中的第一点。
    precision mediump int;
    precision lowp sampler2D;
    precision lowp samplerCube;