码迷,mamicode.com
首页 > 其他好文 > 详细

Cg入门16:Fragment shader - 片段级光照

时间:2016-03-23 18:32:19      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
技术分享
将顶点程序实现漫反射放至片段程序后处理效果如下:
技术分享
技术分享

看到和左边内建实现的漫反射一样了

片段程序特点:
1.采用三角面的形式渲染,而顶点程序是按顶点形式渲染

注意事项:直接将计算好的顶点法线向量和光向量 直接传给片段程序使用
技术分享
技术分享
效果如下:为啥不一样呢?
技术分享
技术分享
顶点程序:
1.按顶点计算,一个顶点一个顶点处理程序

片段程序:
1.先进行光栅化,把面片分割成三角形,
2.一个片段程序,可以看成一个一个像素处理

原因:
1.由于面片程序,分割成很多个小三角形处理,但是一下三角形上的法线和光向量相同,就导致了这种现象,一大段黑、一大段灰,不像左边系统内置的一样有过度的效果。

解决办法:
1.将原始数据传入片段程序,然后再处理
技术分享
Shader "Sbin/vf48" {
	Properties
	{
		_MainColor("MainColor",color) = (1,1,1)
		_SpecalarColor("SpecularColor",color) = (1,1,1)
		_Shininess("Shininess",Range(1,94)) = 8
	}

	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;
				float4 vertex:COLOR;
			};

			float4 _MainColor;
			float4 _SpecalarColor;
			float _Shininess; 

			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 v):COLOR
			{
				//Ambient Color 环境光
				float4 col = UNITY_LIGHTMODEL_AMBIENT;

				float3 N = UnityObjectToWorldNormal(v.normal);
				float3 L = normalize(WorldSpaceLightDir(v.vertex));
				float3 V = normalize(WorldSpaceViewDir(v.vertex));
			
				//deffuse Color 漫反射
				float ndot = saturate(dot(N,L));//saturate把点积的结果限定在[0-1]
				col += _LightColor0*_MainColor * ndot;

				//Specular Color镜面高光
				float3 R = 2*dot(N,L)*N-L;
				R = normalize(R);

				//dot:向量点积
				float specularScale = pow(saturate(dot(R,V)),_Shininess);//pow:数的n次幂
				col += _SpecalarColor * specularScale;

				//点光源
				float3 wpos = mul(_Object2World,v.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
		}
	} 
}
技术分享

技术分享
技术分享

技术分享

Cg入门16:Fragment shader - 片段级光照

标签:

原文地址:http://blog.csdn.net/aa4790139/article/details/50964329

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!