WebGL 着色器材质内部变量——使用文档

基本介绍

变量名称类型定义位置解释
gl_Positionvec4顶点-着色器顶点位置
gl_FragColorvec4片元-着色器片元颜色
gl_PointSizefloat顶点-着色器几何体顶点大小
gl_PointCoordvec2片元-着色器几何体顶点"UV"坐标
gl_FragCoordvec2片元-着色器几何体顶点世界坐标

1. gl_Position 顶点位置坐标

类型:vec4

在顶点着色器中定义,表示最片元着色器要 片元化 时使用的顶点坐标。

gl_Position = vec4(1.0,1.0,1.0,1.0); // 前三个值分别表示x、y、z 坐标

顶点着色器呈现三维:投影矩阵 * 视图矩阵 * 模型矩阵 * 顶点坐标

示例:

// 顶点着色器
const vertex = /*glsl*/``
    void main(){
       // 定义模型的世界坐标信息-若需要考虑模型在整个空间中的位置因素,采用此值
       vec4 modelWorldPosition=modelMatrix*vec4(position,1.0);
       // 呈现三维
        gl_Position = projectionMatrix * viewMatrix * modelWorldPosition;
}
  • projectionMatrix 投影矩阵
  • viewMatrix 视图矩阵
  • modelMatrix 模型矩阵
    • modelMartix * vec4(position,1.0) 定义的vec4为该物体的世界坐标信息
    • position 物体自身的坐标信息

2. gl_FragColor 片元颜色

类型:vec4

在片元着色器中定义,vec4(rgba) 的取值范围均为 [0,1]

gl_FragColor = vec4(1.0,0.0,0.0,1.0); // 四个值表示r(红色)、g(绿色)、b(蓝色)、a(透明度)

示例:

利用uv属性设置渐变颜色

传递过来的uv,坐标原点是模型的左上角,即左上角为 [0,0] ,右上角为 [1,1] 。而用 gl\_FragCoord 定义的几何体顶点"uv",坐标原点是该点的左上角 [0,0]

// 顶点着色器 -> 传递uv值
const vertex = /*glsl*/``
    // 1.2 将uv传递至片元着色器
    varying vec2 vUv;
    void main(){
       // 1.1 定义uv值,只能在主函数中获取
       vUv = uv;
}

// 片元着色器 -> 设置颜色uv
const fragment = /*glsl*/``
    // 1.3 接收uv值
    varying vec2 vUv;
    void main(){
        // 1.4 设置颜色
        gl_FragColor = vec4(vUv,0.0,1.0);
}

image.png

注意:

若想使 gl\_FragColor 第四个参数(透明度)生效,需在着色器材质 THREE.ShaderMaterial 中开启透明度

const shaderMat = new THREE.ShaderMaterial({
    // 开启透明度
    transparent: true,
    vertexShader: baseVertexShader,
    fragmentShader: baseFragmentShader,
});

3. gl_PointSize 点的大小

类型:float

在顶点着色器中定义,设置 BufferGeometry 几何体的所定义的顶点的大小(顶点只是一个点,我们是看不到),表现为正方形。

// 顶点着色器
const pointVertex = /*glsl*/ ``
void main(){
    vec4 modelWorldPosition=modelMatrix*vec4(position,1.0);
    gl_Position=projectionMatrix * viewMatrix * modelWorldPosition;
    // 1.1 设置顶点大小
    gl_PointSize =100.0; // 默认为 0
};

4. gl_PointCoord 点的uv坐标

类型:vec2

主要在片元着色器中使用。

由于BufferGeometry是通过THREE.vector3来定义顶点坐标,因此与其他模型相比,没有所谓的UV。但可以通过 gl\_PointCoord 设置。

点自身的gl\_PointCoord 伪uv坐标,坐标原点是该点的左上角,整体范围是0-1。即左上角为 [0,0] ,右下角为 [1,1] ;注:大小是通过 gl\_PointSize 定义的。

// 片元着色器
const fragment = /*glsl*/``
    gl_FragColor = vec4(gl_PointCoord,0.0,1.0);
}

image.png

示例:
几何体顶点,实现色块分割

// 片元着色器
const fragment = /*glsl*/``
    if(gl_PointCoord.x < 0.5){ // gl_PointCoord.x 取值范围为[0,1]
        gl_FragColor = vec4(1.0,0.0,0.0,1.0);// 红色
    } else{
        gl_FragColor = vec4(0.0,1.0,0.0,1.0);// 绿色
    } 
}

image.png

5. gl_FragCoord 点的世界坐标

类型:vec2

主要在片元着色器中使用。

此为canvas画布上的渲染的的位置坐标,坐标原点与gl_PointCoord一致,均为左上角 [0,0]

// 片元着色器
const fragment = /*glsl*/``
    // 若需要考虑几何体顶点在整个空间中的位置因素,采用此值
    gl_FragColor = vec4(gl_FragCoord,0.0,1.0);
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值