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> // 颜色随机抖动
}