Skip to content

shader 源码

  • 顶点着色器
glsl
#include <common>           // 包含着色器公共模块(包含常用的数学工具函数以及一些常量定义什么的)
#include <uv_pars_vertex>   // 包含处理uv所需要的一些定义
#include <uv2_pars_vertex>  // 包含处理uv2所需要的一些定义
#include <displacementmap_pars_vertex> // 包含置换贴图displacementmap所需要的定义
#include <color_pars_vertex>            // 包含顶点颜色所需要的定义
#include <fog_pars_vertex>              // 包含雾化效果所需要的定义
#include <morphtarget_pars_vertex>      // 包含变形动画所需要的定义
#include <skinning_pars_vertex>         // 包含蒙皮动画所需要的定义
#include <shadowmap_pars_vertex>        // 包含阴影计算所需要的定义
#include <logdepthbuf_pars_vertex>      // 包含深度处理的一些定义
#include <clipping_planes_pars_vertex>  // 包含裁剪平面所需要的一些定义
void main() {
    #include <uv_vertex>            // uv 数据处理
    #include <uv2_vertex>           // uv2 数据处理
    #include <color_vertex>         // 颜色 数据处理
    #include <beginnormal_vertex>   // 开始法线处理
    #include <morphnormal_vertex>   // 变形动画法线处理
    #include <skinbase_vertex>      // 骨骼蒙皮基本运算
    #include <skinnormal_vertex>    // 骨骼蒙皮法线运算
    #include <defaultnormal_vertex> // 默认法线处理
#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED
    vNormal = normalize( transformedNormal );
#endif
    #include <begin_vertex>         // 开始顶点位置处理
    #include <morphtarget_vertex>   // 变形动画位置处理
    #include <skinning_vertex>          // 蒙皮顶点处理
    #include <displacementmap_vertex>   // 置换贴图运用顶点处理
    #include <project_vertex>           // 投影顶点运算
    #include <logdepthbuf_vertex>       // logDepth深度运算
    #include <clipping_planes_vertex>   // 裁剪平面运算
    vViewPosition = - mvPosition.xyz;
    #include <worldpos_vertex>      // 世界坐标运算
    #include <shadowmap_vertex>     // 阴影所需要的一些运算
    #include <fog_vertex>           // 雾化所需要的运算
}
  • 片元着色器
glsl
uniform vec3 diffuse; // 漫反射颜色
uniform vec3 emissive; // 自发光颜色
uniform float roughness; // 粗糙度
uniform float metalness; // 金属性
uniform float opacity;  // 透明度
#ifndef STANDARD
    uniform float clearCoat;  //
    uniform float clearCoatRoughness;
#endif
varying vec3 vViewPosition; // 摄像机空间的坐标
#ifndef FLAT_SHADED
    varying vec3 vNormal; // 摄像机空间的法线
#endif
#include <common>           //  包含着色器公共模块(包含常用的数学工具函数以及一些常量定义什么的)
#include <packing>          // 数据编码解码功能函数
#include <dithering_pars_fragment>  // 抖动处理的定义
#include <color_pars_fragment>      // 颜色处理的定义
#include <uv_pars_fragment>         // uv相关处理的定义
#include <uv2_pars_fragment>        // uv2相关处理的定义
#include <map_pars_fragment>        // map贴图相关处理的定义
#include <alphamap_pars_fragment>   // alphamap贴图的处理定义
#include <aomap_pars_fragment>      // aomap贴图的处理定义
#include <lightmap_pars_fragment>   // lighmap贴图处理定义
#include <emissivemap_pars_fragment>    // emissivemap贴图处理的定义
#include <envmap_pars_fragment> // envmap贴图处理的定义
#include <fog_pars_fragment>    // 雾化需要的定义
#include <bsdfs>                    // brdf相关的功能函数
#include <cube_uv_reflection_fragment>  // cubemap反射相关
#include <lights_pars_begin>        // 灯光相关定义
#include <lights_pars_maps>         // 灯光贴图相关
#include <lights_physical_pars_fragment> // 灯光相关物理运算
#include <shadowmap_pars_fragment>  // shadowmap影子相关运算定义
#include <bumpmap_pars_fragment>        // bumpmap相关运算的定义
#include <normalmap_pars_fragment>      // normalmap相关运算的定义
#include <roughnessmap_pars_fragment>       // roughnessmap相关运算的定义
#include <metalnessmap_pars_fragment>       // metalnessmap相关运算的定义
#include <logdepthbuf_pars_fragment>        // logdepth相关运算的定义
#include <clipping_planes_pars_fragment>        // clipplane裁剪平面相关的定义
void main() {
    #include <clipping_planes_fragment> // 裁剪平面裁剪
    vec4 diffuseColor = vec4( diffuse, opacity );// 合成rgba四通道漫反射颜色
    ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
    vec3 totalEmissiveRadiance = emissive;
    #include <logdepthbuf_fragment> // logdepth运算
    #include <map_fragment>         // map通道颜色采样
    #include <color_fragment>       // color参与计算
    #include <alphamap_fragment>    // alphamap通道颜色采样
    #include <alphatest_fragment>   // alpha测试
    #include <roughnessmap_fragment>    // 粗糙贴图采样
    #include <metalnessmap_fragment>    // 金属性贴图采样
    #include <normal_fragment_begin>    // 法线贴图基本运算
    #include <normal_fragment_maps>     // 法线通过法线贴图运算
    #include <emissivemap_fragment>     // 自发光贴图采样
    // accumulation
    #include <lights_physical_fragment> // 物理光照基础运算
    #include <lights_fragment_begin> // 计算各种灯光入射光和反射光信息
    #include <lights_fragment_maps> // 从环境光和光照贴图获取辐射
    #include <lights_fragment_end>  // 根据辐射光取得反射信息
    // modulation
    #include <aomap_fragment>   // 根据AO贴图调整反射光照强度
    // 反射光直接漫反射+间接漫反射+直接高光+间接高光+自发光 = 输出光照颜色
    vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;
    gl_FragColor = vec4( outgoingLight, diffuseColor.a );
    #include <tonemapping_fragment>// tonemap进行曝光
    #include <encodings_fragment> // 颜色编码
    #include <fog_fragment>             // 雾化颜色运算
    #include <premultiplied_alpha_fragment> // 颜色预乘alpha
    #include <dithering_fragment>   // 颜色随机抖动
}