在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; 
  1. 你不需要在常量/文字上使用精度指定符,因为它们可以将编译时间评估为指定给它们的值。 而且,由于gl_FragColor的精度已经根据渲染目标的深度来定义,所以你分配给它的精度应该不重要。

  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; 

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

  3. 只有GL_FRAGMENT_PRECISION_HIGHmacros定义为1系统才支持GL_FRAGMENT_PRECISION_HIGH ; 其余的你会得到一个编译器错误。 ( 4.5.4 Available Precision Qualifiers

  4. 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格式