three 基本材质类型总结

138 阅读2分钟

导言:材质是 three 中比较复杂的部分,相比起灯光,动画,几何体,最复杂的要数材质,主要体现在材质的混合,深度,以及模板。

先聊一聊混合,混合复杂点在于理解弄清楚在哪里混合,什么与什么混合。先说下在哪里混合,混合为缓冲区混合,混合了目标与源最后渲染到界面上,至于能混合能控制什么,都有什么作用在上一节已经介绍过。下面给出一个混合透明的例子 blendAlpha 取值范围 0 - 1 当两个透明对象重合时,透明混合时当前材质颜色混合背景的权重比

再看一看深度,深度的复杂点也与混合差不多,也是要清楚比较目标与当前的关系,但是深度简单一些就是控制 Z 轴上距离远近的显示问题,以下是一个简单的示例 其中材质A总是渲染,即使前方有物体遮挡

    //  此物体总会被显示
    const materialA = new THREE.MeshBasicMaterial({ 
        color: 0xff0000,
        transparent: true,
        depthFunc: THREE.AlwaysDepth 
    });

最后就是模板了,模板比混合复杂一些,需要先在混染器中启用 stencil 属性。 模板的三个概念,第一 写入缓冲区 stencilWrite 这个属性启用之后会将当前材质写入缓冲区,第二 模板基准值 stencilRef 这个属性决定了比较的材质 材质A 写入缓冲区,材质B写入缓冲区,但他们的 stencilRef 值都为 1 就可以比较 否则比较不了,第三 就是 stencilFunc 这个属性决定了比较的方法需要注意的是当第一个材质时 由于之前缓冲区没有值 需要设置为 THREE.AlwaysStencilFunc, 而比较后的值要设置为 ReplaceStencilOp 賛换缓冲区的值。下面是一个简单的示例

结语:在基类材质中最复杂的就以上几个点,已经介绍完闭,其他的属性都是比较简单的,最后聊一聊我在学习的遇到的问题,第一不清楚属性是做什么的在使用 AI 辅助发现AI 也不清楚这些东西,最后通过整合各类资料才将这些属性的作用整理出来。