在OpenGL ES 2.0/GLSL中,您需要哪些精度说明符?

Jes*_*ssy 48 glsl opengl-es-2.0

您填充值的变量是否决定了您正在使用的精度,等号的右侧?

例如,这里的精度说明符是否有任何意义上的区别:

gl_FragColor = lowp vec4(1);
Run Code Online (Sandbox Code Playgroud)

这是另一个例子:

lowp float floaty = 1. * 2.;
floaty = lowp 1. * lowp 2.;
Run Code Online (Sandbox Code Playgroud)

如果你采用一些浮点数,并从它们创建一个向量或矩阵,那么该向量或矩阵是否会采用您填充它的值的精度,或者这些值是否会转换为另一个精度级别?

我认为优化这个最好能回答这个问题:

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal)
Run Code Online (Sandbox Code Playgroud)

我的意思是,它是否需要走这么远,如果你想尽可能快,或者它有些无用吗?

lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal)
Run Code Online (Sandbox Code Playgroud)

我知道你可以定义float的默认精度,并且这可以用于之后的向量和矩阵.假设为了教育的目的,我们之前已经定义了这个:

precision highp float;
Run Code Online (Sandbox Code Playgroud)

Mik*_*ola 71

  1. 您不需要常量/文字的精度说明符,因为那些得到的编译时间被评估为它们被分配给它们的任何内容.此外,由于gl_FragColor已经根据渲染目标的深度定义了精度,因此分配给它的精度无关紧要.

  2. 在顶点着色器中,默认情况下声明以下精度:( 4.5.3 Default Precision Qualifiers)

    precision highp float;
    precision highp int;
    precision lowp sampler2D;
    precision lowp samplerCube;
    
    Run Code Online (Sandbox Code Playgroud)

    在片段着色器中,您得到:

    precision mediump int;
    precision lowp sampler2D;
    precision lowp samplerCube;
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • "而且,因为gl_FragColor的精度已经根据渲染目标的深度定义了"这个声明的来源是什么?我在规范中没有看到任何关于此的信息. (6认同)