漫反射的原理实例
Tags{ "LightMode"="ForwardBase" }

CGPROGRAM
#include "Lighting.cginc"
fixed4 _Diffuse;//假装是物体的自身颜色

struct a2v{
	float4 v:POSITION;
	float3 nor:NORMAL;
};

struct v2f{
	float4 position:SV_POSITION;
	float3 col:COLOR0;
};

#pragma vertex vert
#pragma fragment frag

v2f vert(a2v v){
	v2f f;
	f.position = UnityObjectToClipPos(v.v);

	//计算光颜色
	fixed3 norDir = normalize((fixed3) mul(unity_ObjectToWorld,float4(v.nor,0)));
	fixed3 lightDir = normalize( _WorldSpaceLightPos0.xyz );
        
        fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//环境光

	f.col = _LightColor0.rgb  * max(dot(norDir,lightDir),0) * _Diffuse + ambient;

	return f;
}

fixed4 frag(v2f f):SV_Target{
	return fixed4(f.col,1);
}

ENDCG


内置变量和方法:

UnityObjectToClipPos(pos) 其实就是:mul(UNITY_MATRIX_MVP,pos),变换模型坐标到裁剪坐标

unity_ObjectToWorld就是_Object2World,模型坐标到世界坐标的变换矩阵

_WorldSpaceLightPos0.xyz 就是第一个平行光的位置(方向)

_LightColor0.rgb 就是第一个平行光的颜色

UNITY_LIGHTMODEL_AMBIENT.rgb 环境光的颜色

normalize() 单位化向量的方法

max() 返回参数中的较大值

dot() 向量的点积


首页 我的博客
粤ICP备17103704号