2011-03-20 78 views
42

是否将填充值的变量指示您在等号右侧使用的精度?在OpenGL ES 2.0/GLSL中,您需要哪些精度说明符?

例如,有没有什么区别,意义,对精度说明这里:

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; 

回答

60
  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; 
    

    这意味着,如果你声明的浮动一个片段着色器,你必须说明它是否是lowpmediump。精度的默认值也扩展到矩阵/向量。

  3. highp仅在具有GL_FRAGMENT_PRECISION_HIGH宏定义为1的系统上受支持;其余的你会得到一个编译器错误。 (4.5.4 Available Precision Qualifiers

  4. 表达式中的精度规则是它们会自动转换为它们绑定到的赋值/参数的类型。所以对于你的点,默认情况下它会使用输入类型的精度,并且额外的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

+5

“此外,由于gl_FragColor的精度已经根据渲染目标的深度定义”这个语句的来源是什么?我在规范中没有看到关于此的任何信息。 – eodabash 2013-02-01 10:10:38