在OpenGL ES 2.0/GLSL中,您需要哪些精度说明符?
是否将填充值的变量指示您在等号右侧使用的精度?在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;
你不需要在常量/文字精度说明,因为这些获得编译评估,不管他们被分配到的时间。而且,由于
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
。精度的默认值也扩展到矩阵/向量。 highp
仅在具有GL_FRAGMENT_PRECISION_HIGH
宏定义为1
的系统上受支持;其余的你会得到一个编译器错误。 (4.5.4 Available Precision Qualifiers
)表达式中的精度规则是它们会自动转换为它们绑定到的赋值/参数的类型。所以对于你的点,默认情况下它会使用输入类型的精度,并且额外的
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的精度已经根据渲染目标的深度定义”这个语句的来源是什么?我在规范中没有看到关于此的任何信息。 – eodabash 2013-02-01 10:10:38