Unity 表面主色器组成及编译指令

内容简介

surface shader 重组成部分:两个结构体以及编译指令

  • 一、两个结构体(Input和SurfaceOutput)
  • 二、编译指令
  • 三、渲染管线中的流程(两个结构体和四个函数)

一、两个结构体(Input和SurfaceOutput)

1、Input结构体

(1)允许我们自定义
(2)内置变量:
a:float3 viewDir 定义视角方向
b:float4 screenPos 屏幕坐标位置
c:float3 worldPos 世界坐标位置
d:float3 worldRefl 世界坐标系反射向量(未修改Normal变量是使用此变量)
e:float4 whith COLOR semantic 每个顶点颜色的插值
f:float3 worldNormal 世界坐标系法线方向(未修改Normal变量是使用此变量)
g:float3 worldRefl; INTERNAL_DATA 世界坐标系反射向量(修改了Normal变量是使用此变量)
h:float3 worldNormal; INTERNAL_DATA 世界坐标系法线方向(修改了Normal变量是使用此变量)
(3)自定义变量
纹理坐标:以uv_做前缀,纹理名称作为结尾

(4)结构体体内的变量只有在真正使用的时候才会被计算生成

2、SurfaceOutput结构体

(1)结构体内无法自定义变量
(2)标准结构体:

struct SurfaceOutput
{
fixed3 Albedo; // 反射光颜色
fixed3 Normal; // 法线方向
fixed3 Emission;// 自发光颜色
half Specular; // 高光反射系数(0到1范围内)
fixed Gloss; // 高光中发射的强度系数
fixed Alpha; // 透明通道
};

二:编译指令

1、代码写在CGPROGRAM和ENDCG之间,区别于CG他必须写在SubShader内部,而不能写在Pass内部2、编译指令格式:#program surface surfaceFunction lightModel[optionalparams](1)surfaceFunction通常就是名为surf的函数(函数名可以任意)必须指定,其固定格式为:
void surf(Input IN,inout SurfaceOutput o)
(2)lightModel 光照模型函数,必须指定,Unity内置了一些光照模型——Lambert(diffuse)和Blinn-Phong(Specular),默认情况下使用的是内置的Lambert模型
(3)optionalparams包含可用的指令类型,包括开启、关闭一些状态,设置生成pass类型、指定可选函数
(4)另外两种函数:vertex:VertextFuction和finalcolor:ColorFunction

三、渲染管线中的流程(两个结构体和四个函数)

vertex data—>vertex shader(vertexFuction函数)—>struct v2f_surf—>Frament shader(struct input—>surf函数—>struct SurfaceOutput—>LightingXXX光照函数—>initial color—>其他颜色的叠加—>colorFunction—>final color)
1、生成Vertex shader
(1)如果自定义了VertexFunction函数,Unity会在这里首先调用VertexFunction修改顶点数据,然后分析VertexFunction修改的数据,最会后通过Input结构体将修改结果存储到V2f_surf中;
(2)计算v2f_surf中其他默认的变量,主要包括pos、纹理坐标、mormal、vlight、lmap等;
(3)最后通过内置的TRANSEFR_VERTEX_TO_FRAGMENT指令将v2f_surf传递给下面的Frament Shader。
2、生成Framement Shader
(1)使用v2f_surf中的对应变量填充Input结构,例如纹理坐标等
(2)调用surfFunction函数填充SurfaceOutput结构;
(3)调用LightXXX光照函数得到初始化的颜色值;
(4)进行其他颜色的叠加。如果没有启用LightMap,这里会使用SurfaceOutput.Albedo和v2f_surf.vlight的乘积和原颜色值进行叠加;
(5)最后如果自定义了final函数,则调用他进行最后的颜色修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值