欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-10 21:05:58
...

内容简介

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变量是使用此变量)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(3)自定义变量

纹理坐标:以uv_做前缀,纹理名称作为结尾
  • 1
  • 2

(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函数,则调用他进行最后的颜色修改

相关标签: Shader