你填充值的变量是否决定了你正在使用的精度,在等号的右边?
例如,这里的精度说明符是否有任何意义上的区别:
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;
答案 0 :(得分:71)
您不需要常量/文字的精度说明符,因为那些得到的编译时间被评估为它们被分配给它们的任何内容。此外,由于已经根据渲染目标的深度定义了gl_FragColor
的精度,因此分配给它的精度无关紧要。
在顶点着色器中,默认声明以下精度:(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;
这意味着如果您在片段着色器中声明一个浮点数,则必须说明它是lowp
还是mediump
。默认的float
/ int
精度也扩展到矩阵/向量。
highp
宏定义为GL_FRAGMENT_PRECISION_HIGH
的系统才支持 1
;其余的你会得到一个编译器错误。 (4.5.4 Available Precision Qualifiers
)
表达式中的精度规则是它们会自动转换为它们绑定的赋值/参数的类型。因此,对于您的点,默认情况下它将使用输入类型的精度,并且不需要额外的lowp
(并且在语法上不正确)。如果要将类型向下转换为较低的精度,唯一的方法是明确地将其指定为较低的精度。
这些答案全部来自Khronos GLSL规范,您可在此处找到(相关章节为4.5.2和4.5.3):http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf