圖形學入門---反射向量與Cg reflect函式
阿新 • • 發佈:2019-01-26
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 } } }