您要填充值的变量是否决定了您在等号右侧使用的精度?
例如,这里的精度说明符在含义上是否有任何区别:
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.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
or a mediump
。默认float
/int
精度也扩展到矩阵/向量。
-
highp
仅在具有以下功能的系统上受支持GL_FRAGMENT_PRECISION_HIGH
宏定义为1
;其余的你会得到一个编译器错误。 (4.5.4 Available Precision Qualifiers
)
-
表达式中的精度规则是它们自动转换为它们所绑定的赋值/参数的类型。因此,对于您的点,默认情况下它将使用输入类型的精度以及附加的精度lowp
是不必要的(并且语法上不正确)。如果要将类型向下转换为较低的精度,唯一的方法是将其显式分配给较低的精度。
这些答案均来自 Khronos GLSL 规范,您可以在此处找到(相关部分为 4.5.2 和 4.5.3):https://www.khronos.org/registry/OpenGL/specs/es/2.0/GLSL_ES_Specification_1.00.pdf https://www.khronos.org/registry/OpenGL/specs/es/2.0/GLSL_ES_Specification_1.00.pdf
在该规范的最新版本中,这些部分是 4.7.3 和 4.7.4。除了添加默认值外,没有任何更改precision highp atomic_uint;
到两个列表。看https://www.khronos.org/registry/OpenGL/specs/es/3.2/GLSL_ES_Specification_3.20.pdf https://www.khronos.org/registry/OpenGL/specs/es/3.2/GLSL_ES_Specification_3.20.pdf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)