返回

深入URP之Shader篇8: SimpleLit Shader分析(4)

前端

前言

在深入了解URP的Shader之前,我们先来回顾一下Simple Lit Forward Pass的流程:

  1. Vertex Shader (顶点着色器) :计算顶点位置、法线、切线和纹理坐标。
  2. 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;

具体分析:

  1. 计算光照方向lightDir,并将其归一化。
  2. 计算片段的表面法线normal,并将其归一化。
  3. 获取光照颜色lightColor。
  4. 计算漫反射diffuse,公式为max(0, dot(normal, lightDir)) * lightColor
  5. 组装输出颜色fragColor,包含漫反射和不透明度(默认为1)。
  6. 返回输出颜色fragColor。

总结

Fragment shader函数Initi的主要功能是计算像素的漫反射颜色。通过计算光照方向、表面法线和光照颜色,函数可以确定像素被照亮程度,并生成相应的光照颜色。

相关阅读