您要填充值的变量是否决定了您在等号右侧使用的精度?
例如,这里的精度说明符在含义上是否有任何区别:
gl_FragColor = lowp vec4(1);
这是另一个例子:
lowp float floaty = 1. * 2.;
floaty = lowp 1. * lowp 2.;
如果您采用一些 float ,并从中创建一个向量或矩阵,该向量或矩阵是否会采用您填充的值的精度,或者这些值是否会转换为另一个精度级别?
我认为优化它可以最好地回答这个问题:
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 Default Precision Qualifiers
)precision highp float; precision highp int; precision lowp sampler2D; precision lowp samplerCube;
在片段着色器中你会得到:
precision mediump int;
precision lowp sampler2D;
precision lowp samplerCube;
这意味着如果你在片段着色器中声明一个 float ,你必须说明它是否是 lowp
或mediump
。默认float
/int
精度也扩展到矩阵/向量。
highp
仅在具有GL_FRAGMENT_PRECISION_HIGH
的系统上受支持宏定义为1
;其余的你会得到一个编译器错误。 (4.5.4 Available Precision Qualifiers
)表达式中的精度规则是它们自动转换为它们所绑定(bind)的赋值/参数的类型。因此,对于您的点,默认情况下它将使用输入类型的精度和附加
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
在该规范的最新版本中,这些部分是 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
关于glsl - 在 OpenGL ES 2.0/GLSL 中,哪里需要精度说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366416/