shader中一些光照模型

来源:互联网 发布:gagamatch网络异常 编辑:程序博客网 时间:2024/05/22 19:31

     漫反射光照模型

         何为漫反射呢?即指光线被粗糙表面无规则地向各个方向反射的现象。通俗一点就是相对高光而言,没有刺眼的光斑产生.

首先我们给出漫反射部分计算公式:Cdiffuse=(Clight*Mdiffuse)max(0,n*l)

主要我们看看漫反射模型的shader代码:

Properties{

         _Diffuse("Diffuse",Color)=(1,1,1,1)

}

这里我们定义了一个属性即漫反射颜色_Diffuse设置为(1,1,1,1)白色。

SubShader{

      Pass{

                 Tags{"LightModel"="ForwardBase"}

我们在管线里面定义了通道,通道里面再定义了一个标签,只有这样我们才能使用内置光照,比如LightColor0等。

代码如下:

CGPROGRAM

#pragma vertex vert
#pragma fragment frag

#include "Lighting.cginc"

fixed4 _Diffuse;

上面定义了两个着色器vertex定点着色器和fragment片元着色器,然后引用Unity内置灯光效果文件,以及定义了一个属性的类型_Diffuse.

struct a2v {

  float4 vertex : POSITION;

float3 normal : NORMAL;

};

struct v2f {

float4 pos : SV_POSITION;

fixed3 color : COLOR;

};

使用两个结构体定义了定点着色器和片元着色器所需的一些变量。

v2f vert(a2v v) {

v2f o;

// Transform the vertex from object space to projection space

o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

// Get ambient term

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

// Transform the normal from object space to world space

fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));

// Get the light direction in world space

fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);

// Compute diffuse term

fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));

o.color = ambient + diffuse;

return o; }

fixed4 frag(v2f i) : SV_Target {

return fixed4(i.color, 1.0);

}

ENDCG

}

}

FallBack "Diffuse"

}

上面就是顶点着色器和片元着色器的具体实现,由于我们上面采用的是逐顶点光照的,所以片元着色器直接输出即可,运行结果如下:


                                             
0 0
原创粉丝点击