返回
深入URP之Shader篇8: SimpleLit Shader分析(4)
前端
2023-09-22 11:41:37
前言
在深入了解URP的Shader之前,我们先来回顾一下Simple Lit Forward Pass的流程:
- Vertex Shader (顶点着色器) :计算顶点位置、法线、切线和纹理坐标。
- Pixel Shader (像素着色器) :计算每个像素的颜色。
本篇将继续分析Fragment shader函数Initi的具体实现。
Fragment Shader函数Initi
Fragment shader函数Initi的声明如下:
float4 Initi(Input IN, FragInputs FI) : SV_Target
参数:
- IN :输入结构体,包含顶点着色器传递的插值数据。
- FI :FragInputs结构体,包含一些片段着色器常用的变量。
返回值:
- SV_Target :输出颜色值。
函数体分析
函数体的主要逻辑如下:
float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
float3 normal = normalize(FI.normalWS);
float3 lightColor = _LightColor0.rgb;
float3 diffuse = max(0, dot(normal, lightDir)) * lightColor;
float4 fragColor = float4(diffuse, 1);
return fragColor;
具体分析:
- 计算光照方向lightDir,并将其归一化。
- 计算片段的表面法线normal,并将其归一化。
- 获取光照颜色lightColor。
- 计算漫反射diffuse,公式为
max(0, dot(normal, lightDir)) * lightColor
。 - 组装输出颜色fragColor,包含漫反射和不透明度(默认为1)。
- 返回输出颜色fragColor。
总结
Fragment shader函数Initi的主要功能是计算像素的漫反射颜色。通过计算光照方向、表面法线和光照颜色,函数可以确定像素被照亮程度,并生成相应的光照颜色。