Fragment shader---片段级光照1

1、将法向量和光向量从顶点函数vert移动到片段函数frag

Shader "Custom/f_diffuse" {

	SubShader{
		pass {

		tags{ "LightMode" = "ForwardBase" }

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

		struct v2f {
			float4 pos:POSITION;
			float3 normal:NORMAL;
			float3 lightDir:COLOR;
		};

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

			//o.normal = normalize(v.normal);
			o.normal = UnityObjectToWorldNormal(v.normal);
			o.lightDir = normalize(WorldSpaceLightDir(v.vertex));


			

			return o;
		}


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

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

			col += _LightColor0*diffuseScale;
			return col;
		}
		ENDCG
	}
	}

}

 


着色后的效果:右边的小球是自定义着色器




2、

顶点程序是基于顶点的,模型当中有一个顶点,就会启动一个顶点程序,有两个顶点,就会对两个顶点都同时并行地进行处理。当顶点程序计算出结果,传递给片断程序frag,片断程序会进行光栅化处理。这个特性利用了显卡底层的特性。能够把三角形面片分割为每一个像素点。一个片断程序对应于一个像素的处理,一个三角形会分割为很多的小像素,而我们总是对同一个三角形的那一片数据使用了相同的法向量和光向量,对于三角形分割较少,在顶点中使用了相同的数据,由这些数据分割出来的像素使用的是同样的数据在frag中,在frag中起不到差值分割的目的。所以获取法向量和光向量放在顶点程序中是错误的,应该放在片段程序当中。


o.normal = UnityObjectToWorldNormal(v.normal);

o.lightDir = normalize(WorldSpaceLightDir(v.vertex));


光滑度基本上和左侧默认的shader一致




放大也没有出现斑块问题:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值