为什么必须为片段着色器设置精度?

安德烈·布什曼

我学习WebGL。下一个着色器可以正常工作:

// vertex.shader
// precision mediump float;
attribute vec4 a_Position;
attribute float a_PointSize;

void main(){
  gl_Position = a_Position;
  gl_PointSize = a_PointSize;
}

// fragment.shader
precision mediump float;
uniform vec4 u_FragColor;

void main(){
  gl_FragColor = u_FragColor;
}

为什么必须为片段着色器设置精度?没有此功能,顶点着色器就可以工作,但是没有此代码行,片段着色器就无法工作(如我所见)。为什么存在不同的行为?

之前读过这篇文章,但对我没有帮助。

安东·科尔曼

OpenGL ES 2.0中的片段着色器中的fp类型不存在默认精度。

在顶点着色器中,如果未显式设置浮点类型的默认精度,则默认为highp但是,如果片段着色器也默认设置highp默认值,则会导致问题,因为OpenGL ES 2.0在片段着色器阶段不需要支持高精度浮点类型。

OpenGL ES着色语言 -4.变量和类型-第35-36页

片段语言没有浮点类型的默认精度限定符。因此,对于浮点,浮点向量和矩阵变量声明,声明必须包括精度限定符,或者必须事先声明默认的浮点精度。

4.5.4可用的精密预选赛

内置宏GL_FRAGMENT_PRECISION_HIGH在支持highp片段语言精度的系统上定义为一个

#define GL_FRAGMENT_PRECISION_HIGH 1

并且未在不支持highp片段语言精度的系统上定义定义后,此宏在顶点和片段语言中均可用。highp预选赛中的片段语言的可选功能,并且不被启用#extension

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

GLSL-片段着色器不同部分的精度不同

如果片段着色器不支持高精度,则带有“ highp”限定符的顶点着色器“ varying”变量会发生什么情况?

如何在OpenGLES中为多个对象上的多个纹理设置片段着色器?

是否必须为几何着色器中发出的每个顶点设置每个变量?

为什么需要在webgl着色器中定义精度值?

片段着色器中所有顶点的变体,没有插值。为什么不?

为什么gl_Color不是片段着色器的内置变量?

为什么有些像素在片段着色器中采样了错误的纹理?

如何设置片段着色器的读取和写入纹理?

片段着色器中的OpenGL纹理为黑色

优化片段着色器

片段着色器旋转

THREE.WebGLProgram:着色器错误:gl.getProgramInfoLog必须附加已编译的片段着色器

为什么着色器和程序在OpenGL中存储为整数?

顶点着色器与片段着色器

GLSL着色器-片段着色器无法编译

为什么我的Ray March片段着色器反射纹理查找减慢了帧速率?

为什么用片段着色器进行纹理映射时会在纹理坐标跳跃时生成线条?

错误:在顶点和片段着色器中以不同精度定义的符号

似乎无法在片段着色器中乘以某些东西...精度问题?

THREE.js / GLSL:WebGL着色器根据世界空间位置为片段着色

为什么着色器不包括构建?

为什么我的几何着色器“过载”?

为什么此WebGL着色器类型无效?

为什么在使用着色器时出现黑屏?

为什么OpenGL着色器无法正确编译?

为什么我的GLSL着色器呈现裂痕?

为什么SpriteKit不更新着色器的制服?

为什么在着色器中顺序很重要?