1. 程式人生 > >圖形學入門---反射向量與Cg reflect函式

圖形學入門---反射向量與Cg reflect函式

1、新增點光源後,右側的系統內嵌的小球被點光源照亮了,左側的自定義的shader小球沒有被照亮


2、輔助光照函式ShadeVertexLightsFull只能使用在pass通道的Vertext中,tags標籤必須修改成下面的值


3、新增程式碼o.color.rgb = ShadeVertexLights(v.vertex,v.normal);

Shader "Custom/s_diffuse" {


	SubShader{
		pass {

		tags{"LightMode" = "Vertex"}

		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		#include "lighting.cginc"

		struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};

		v2f vert(appdata_base v) {
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			float3 N = normalize(v.normal);
			float3 L = normalize(_WorldSpaceLightPos0);
			
			N = mul(float4(N,0), _World2Object).xyz;
			N = normalize(N);
			float ndotl = saturate(dot(N, L));
			o.color = _LightColor0*ndotl;

			o.color.rgb = ShadeVertexLights(v.vertex,v.normal);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			//環境光照
			return IN.color+UNITY_LIGHTMODEL_AMBIENT;
		}
			ENDCG
	}
	}

}


點光源對物體起了作用


4、但是著色與左側系統預設的不一樣,使用Shade4PointLights函式

Shader "Custom/s_diffuse" {


	SubShader{
		pass {

		tags{"LightMode" = "ForwardBase"}

		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		#include "lighting.cginc"

		struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};

		v2f vert(appdata_base v) {
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			float3 N = normalize(v.normal);
			float3 L = normalize(_WorldSpaceLightPos0);
			
			N = mul(float4(N,0), _World2Object).xyz;
			N = normalize(N);
			float ndotl = saturate(dot(N, L));
			o.color = _LightColor0*ndotl;

			float3 wpos = mul(_Object2World,v.vertex).xyz;

			o.color.rgb = Shade4PointLights(unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
											unity_LightColor[0].rgb,unity_LightColor[1].rgb,
											unity_LightColor[2].rgb,unity_LightColor[3].rgb,
											unity_4LightAtten0,
											wpos,N);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			//環境光照
			return IN.color+UNITY_LIGHTMODEL_AMBIENT;
		}
			ENDCG
	}
	}

}


球體已經被點光源照亮


5、但是平行光沒有新增上去,因為只賦了rgb的顏色


改為+=就可以與平行光進行合併


Shader "Custom/s_diffuse" {


	SubShader{
		pass {

		tags{"LightMode" = "ForwardBase"}

		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		#include "lighting.cginc"

		struct v2f {
			float4 pos:POSITION;
			fixed4 color : COLOR;
		};

		v2f vert(appdata_base v) {
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
			float3 N = normalize(v.normal);
			float3 L = normalize(_WorldSpaceLightPos0);
			
			N = mul(float4(N,0), _World2Object).xyz;
			N = normalize(N);
			float ndotl = saturate(dot(N, L));
			o.color = _LightColor0*ndotl;

			float3 wpos = mul(_Object2World,v.vertex).xyz;

			o.color.rgb += Shade4PointLights(unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
											unity_LightColor[0].rgb,unity_LightColor[1].rgb,
											unity_LightColor[2].rgb,unity_LightColor[3].rgb,
											unity_4LightAtten0,
											wpos,N);
			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			//環境光照
			return IN.color+UNITY_LIGHTMODEL_AMBIENT;
		}
			ENDCG
	}
	}

}