[置頂] Cg入門16:Fragment shader - 片段級光照



將頂點程序實現漫反射放至片段程序后處理效果如下:

看到和左邊內建實現的漫反射一樣了
片段程序特點: 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
}
}
}




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com