Fragment shader---片段级光照2

遇到的问题:同样的代码,添加镜面反射光specular后,模型着色如下,不知道什么原因,而且最右边使用的自定义着色器的小球着色比系统的暗



1、添加specular镜面反射光

Shader "Custom/s_frag_diffuse_two" {

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

		SubShader{
		pass {

		tags{ "LightMode" = "ForwardBase" }

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

		float4 _SpecularColor;
		float4 _Shininess;

		struct v2f {
			float4 pos:POSITION;
			float3 normal:TEXCOORD1;
			float4 vertex:COLOR;
		};

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

			//原始的法向量
			o.normal = v.normal;
			//原始的光向量
			o.vertex = v.vertex;

			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			//Ambient color
			fixed4 col = UNITY_LIGHTMODEL_AMBIENT;

		float3 N = UnityObjectToWorldNormal(IN.normal);
		float3 L = normalize(WorldSpaceLightDir(IN.vertex));

		//Diffuse Color
		//dot(n,l)确定漫反射的强度问题
		float diffuseScale = saturate(dot(N,L));

		col += _LightColor0*diffuseScale;

		//Specular Color
		//光向量的反向量,即从顶点指向光源
		float3 V = normalize(WorldSpaceViewDir(IN.vertex));
		float3 R = 2 * dot(N, L)*N - L;
		//系数
		float specularScale = saturate(dot(R,V));

		col += _SpecularColor*pow(specularScale, _Shininess);

		return col;
		}
			ENDCG
	}
	}

}

着色后的效果:



2、

Shader "Custom/s_frag_diffuse_two" {

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

		SubShader{
		pass {

		tags{ "LightMode" = "ForwardBase" }

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

		float4 _SpecularColor;
		float4 _Shininess;
		float4 _MainColor;

		struct v2f {
			float4 pos:POSITION;
			float3 normal:TEXCOORD1;
			float4 vertex:COLOR;
		};

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

			//原始的法向量
			o.normal = v.normal;
			//原始的光向量
			o.vertex = v.vertex;

			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			//Ambient color
			fixed4 col = UNITY_LIGHTMODEL_AMBIENT;

		float3 N = UnityObjectToWorldNormal(IN.normal);
		float3 L = normalize(WorldSpaceLightDir(IN.vertex));

		//Diffuse Color
		//dot(n,l)确定漫反射的强度问题
		float diffuseScale = saturate(dot(N,L));

		col += _LightColor0*_MainColor*diffuseScale;

		//Specular Color,使用的是PHONE模型
		//光向量的反向量,即从顶点指向光源
		float3 V = normalize(WorldSpaceViewDir(IN.vertex));
		float3 R = 2 * dot(N, L)*N - L;
		//系数
		float specularScale = saturate(dot(R,V));

		col += _SpecularColor*pow(specularScale, _Shininess);

		return col;
		}
			ENDCG
	}
	}

}

着色后的效果:



3、

添加点光源的影响


Shader "Custom/s_frag_diffuse_two" {

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

		SubShader{
		pass {

		tags{ "LightMode" = "ForwardBase" }

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

		float4 _SpecularColor;
		float4 _Shininess;
		float4 _MainColor;

		struct v2f {
			float4 pos:POSITION;
			float3 normal:TEXCOORD1;
			float4 vertex:COLOR;
		};

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

			//原始的法向量
			o.normal = v.normal;
			//原始的光向量
			o.vertex = v.vertex;

			return o;
		}


		fixed4 frag(v2f IN) :COLOR{
			//Ambient color
			fixed4 col = UNITY_LIGHTMODEL_AMBIENT;

		float3 N = UnityObjectToWorldNormal(IN.normal);
		float3 L = normalize(WorldSpaceLightDir(IN.vertex));

		//Diffuse Color
		//dot(n,l)确定漫反射的强度问题
		float diffuseScale = saturate(dot(N,L));

		col += _LightColor0*_MainColor*diffuseScale;

		//Specular Color,使用的是PHONE模型
		//光向量的反向量,即从顶点指向光源
		float3 V = normalize(WorldSpaceViewDir(IN.vertex));
		float3 R = 2 * dot(N, L)*N - L;
		//系数
		float specularScale = saturate(dot(R,V));

		col += _SpecularColor*pow(specularScale, _Shininess);

		float3 wpos = mul(_Object2World,IN.vertex).xyz;
		//点光源的支持
		col.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 col;
		}
		ENDCG
	}
	}

}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值