在OpenGL ES 2.0 / GLSL中,您需要哪些精度说明符?
你正在填充值的variables是否指示你正在使用什么精度,在等号的右边?
例如,这里的精度说明符有什么不同之处:
gl_FragColor = lowp vec4(1);
这是另一个例子:
lowp float floaty = 1. * 2.; floaty = lowp 1. * lowp 2.;
如果你拿一些浮点数,并从它们中创build一个向量或matrix,那么这个向量或者matrix是否会把你填充的值的精度,或者将这些值转换成另一个精度级别?
我认为优化这个问题最能回答这个问题:
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的默认精度,而且这个假设可以用于向量和之后的matrix。 为了教育的目的,我们之前已经定义了这一点:
precision highp float;
-
你不需要在常量/文字上使用精度指定符,因为它们可以将编译时间评估为指定给它们的值。 而且,由于
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
精度也扩展到matrix/向量。 -
只有
GL_FRAGMENT_PRECISION_HIGH
macros定义为1
系统才支持GL_FRAGMENT_PRECISION_HIGH
; 其余的你会得到一个编译器错误。 (4.5.4 Available Precision Qualifiers
) -
expression式中的精度规则是,它们会自动转换为绑定到的赋值/参数的types。 所以对于你的点,它会默认使用inputtypes的精度,而额外的
lowp
是不必要的(在语法上是不正确的)。 如果要将types向下舍入为较低的精度,则唯一的方法是将其明确指定为较低的精度。
这些答案都来自Khronos GLSL规范,您可以在这里find(相关部分是4.5.2和4.5.3): http : //www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17。 PDF格式