glsl - 在 OpenGL ES 2.0/GLSL 中,哪里需要精度说明符?

标签 glsl opengl-es-2.0

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

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

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;

最佳答案

  1. 您不需要常量/文字的精度说明符,因为它们的编译时间会根据它们被分配的内容进行评估。

  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;

这意味着如果你在片段着色器中声明一个 float ,你必须说明它是否是 lowpmediump 。默认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/

    相关文章:

    OpenGL统一采样器缓冲区: what does it point to?

    iphone - 有没有办法在 iPhone 上使用汇编手工编码着色器而不是使用 GLSL?

    xcode - 有没有一种快速方法可以在 Xcode 中检索 OpenGL ES 函数和符号的文档?

    c++ - 使用自定义着色器的 OpenGL/ES 渲染 = 网格上的伪影

    java - Android OpenGL ES 2.0 只限于内存中的 16 个纹理?

    java - Android OpenGL ES 2.0 : Cube model is not only distorted (perspective is wrong?),但面部加载不正确(顶点不正确?)

    iphone - 使用纹理进行 OpenGL ES 2.0 渲染

    java - GLSL 顶点着色器未编译

    android - 为什么 GL_NUM_SHADER_BINARY_FORMATS 的 glGetIntegerv 生成 GL_INVALID_ENUM?

    javascript - Three.js - 片段着色器基础知识 - 按片段的位置为片段着色