表面着色器

来源:互联网 发布:网络直播唱歌 编辑:程序博客网 时间:2024/05/17 03:34

编写着色器与光照的交互是复杂的。光源有很多类型,不同的阴影选项,不同的渲染路径(正向forward和延迟deferred),着色器应该以某种方式处理所有的复杂点。

它如何工作

定义一个“表面函数(surface function)”,需要输入所有的uv或数据,并在输出结构中填充SurfaceOutPut。基本上描述了表面的特性(光照的颜色反射率。法线。散射与镜面等

)。通过表面着色器编译他,然后计算出需要填充输入什么,输出什么等东西,并产生真实的顶点和像素着色器,以及把渲染路径传递到正向或延迟渲染路径

表面着色器的标准输出结构:

struct  SurfaceOutPut

{

half3 Albedo;  //反射率,(环境光)

half 3Normal;//法线

half3 Emission;//自发光

half3 Specular;高光,也就是镜面

half Gloss;//光泽度

half Alpha;//透明度

};

表面着色器放在CGPROGRAM与ENDCG之间

他必须嵌在子着色器块里面。而不是pass(通道)里面。表面着色器将在多重通道内编译自己。

使用的#pragma surface  。。。指定,声明它是一个表面着色器。

#pragma surface surfaceFunction  lightModel[optionalparams]

surfaceFunction表示cg函数中有表面着色器代码,格式void surf(Input IN,SurfaceOutPut o),Input 是自己定义的结构体,Input结构中应该包含所有包含纹理坐标和便面函数所需要的必要变量。

lightModel也就是光照模式,也可自定义,内置的是Lambert(漫反射)和BlinnPhong(高光)

可选参数:

alpha  透明混合模式,使用它可以写出半透明的着色器

alphatest:VariableName   透明测试模式。使用它可以写出镂空效果的着色器。镂空大小的变量是一个float型的变量

vertex:vertexFunction   自定义的顶点函数

finalcolor:ColorFunction   自定义的最终颜色函数,等等

表面着色器输入结构

Input这个输入结构通常拥有着色器需要的所有纹理坐标,纹理坐标必须命名为“uv”后接纹理名字

可以在输入结构中附加一些值

float3  viewDir  视图方向值。为了计算视差效果(parallax  effect),边缘光照等,需要包含视图方向值。

float4 withCOLOR semantic  每个顶点颜色的插值

float4 screenPos  屏幕空间中的位置,为了反射效果,需要包含屏幕空间中的位置关系

float3  worldPos   世界空间中的位置

float  3  worldRefl   世界空间中的反射向量。若表面着色器不写入法线参数,将包含这个参数。

float3  worldNormal  世界空间中的法线向量。若表面着色器不写入法线参数,将包含这个参数。

float3  worldRefl;INTERNAL_DATA    世界空间中的反射向量,若表面着色器不写入法线参数,将包含这个参数。为了获得基于每个顶点法线贴图的反射需要使用师姐反射向量

float3 worldNormal; INTERNAL_DATA -世界空间中的法线向量(normal vector)。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。为了获得基于每个顶点法线贴图( per-pixel normal map)的法线向量(normal vector)需要使用世界法线向量(WorldNormalVector (IN, o.Normal))。

0 0
原创粉丝点击