图形学入门---半角向量与BlinnPhong

遇到的问题:当法向量使用UnityObjectToWorldNormal()方法后,一直报如下的错



1、向量L:从顶点指向光源并经过正规化后的向量,向量R是反射向量,中间N是顶点的法向量


2、x的值为r乘以a角的余弦值


3、由于r的值是1,所以x就是a的余弦值


4、使用公式R=2*Dot(N,L)*N-L


// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/MySpecular" {

	Properties{
		_SpecularColor("Specular",color) = (1,1,1,1)
		_Shininess("Shininess",range(1,64)) = 8
	}

		SubShader{
		pass {

		tags{ "LightMode" = "ForwardBase" }

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


			float4 _SpecularColor;
		float _Shininess;

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

		v2f vert(appdata_base v) {
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);

			float3 L = normalize(WorldSpaceLightDir(v.vertex));                    //光向量
			float3 N = UnityObjectToWorldNormal(v.normal)							//法向量


																					//使用公式R=2*Dot(N,L)*N-L
			float ndotl = saturate(dot(N, L));
			o.color = _LightColor0*ndotl;
			float3 R = 2 * dot(N, L)*N - L;
			float3 V = WorldSpaceViewDir(v.vertex);
			R = normalize(R);
			V = normalize(V);
			//模拟当物体特别亮,当稍微一转就没有那么亮的物理现象
			float specularScale = pow(saturate(dot(R, V)), _Shininess);
			o.color.rgb += _SpecularColor*specularScale;
			return o;
		}


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

}



5、blingpong



// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/MySpecular" {

	Properties{
		_SpecularColor("Specular",color) = (1,1,1,1)
		_Shininess("Shininess",range(1,64)) = 8
	}

		SubShader{
		pass {

		tags{ "LightMode" = "ForwardBase" }

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


			float4 _SpecularColor;
		float _Shininess;

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

		v2f vert(appdata_base v) {
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);

			float3 L = normalize(WorldSpaceLightDir(v.vertex));                    //光向量
			float3 N = UnityObjectToWorldNormal(v.normal)							//法向量


																					//使用公式R=2*Dot(N,L)*N-L
			float ndotl = saturate(dot(N, L));
			//Ambient Color环境光
			o.color = UNITY_LIGHTMODEL_AMBIENT;

			//Diffuse Color:漫反射光
			o.color += _LightColor0*ndotl;
			float3 R = 2 * dot(N, L)*N - L;
			float3 V = normalize(WorldSpaceViewDir(v.vertex));

			float3 H = L + V;
			H = normalize(H);

			//H和N计算点积
			float specularScale = pow(saturate(dot(H, N)), _Shininess);
			o.color.rgb += _SpecularColor*specularScale;
			return o;
		}


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

}





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值