57

您填充值的变量是否在等号右侧指示您正在使用的精度?

例如,这里的精度说明符是否有任何不同的含义:

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)

我知道您可以定义浮点的默认精度,并且这应该用于之后的向量和矩阵。假设出于教育目的,我们之前已经定义了这个:

precision highp float;
4

1 回答 1

80
  1. 您不需要常量/文字上的精度说明符,因为它们的编译时间会评估为分配给它们的任何内容。

  2. 在顶点着色器中,默认声明以下精度: ( 4.5.3 Default Precision Qualifiers)

    precision highp float;
    precision highp int;
    precision lowp sampler2D;
    precision lowp samplerCube;
    

    在片段着色器中你会得到:

    precision mediump int;
    precision lowp sampler2D;
    precision lowp samplerCube;
    

    这意味着如果你在片段着色器中声明一个浮点数,你必须说明它是 alowp还是 a mediump。默认float/int精度也扩展到矩阵/向量。

  3. highp仅在将GL_FRAGMENT_PRECISION_HIGH宏定义为的系统上受支持1;其余的你会得到一个编译器错误。( 4.5.4 Available Precision Qualifiers)

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

这些答案都来自 Khronos GLSL 规范,您可以在此处找到(相关部分为 4.5.2 和 4.5.3):http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17。 pdf

于 2011-06-13T20:59:43.577 回答