1,基礎知識講解
乙個物體在自然界會收到三種光的影響,周圍的環境光、漫反射和鏡面反射。那麼對於計算機要想模擬現實中的光照,就應該也會實現這三種基本光照->環境光、漫反射、鏡面高光。對於這三種光照,都存在著一定的影響因素,這就需要去追究其光照模型的公式了。
(1),環境光強影響因素
,由此可看出環境光照的效果取決於一般環境光的強度
和漫反射的材質顏色
(2),漫反射光強影響因素
由此可看出,漫反射的反射光取決於入射光強度
和材質常數
,對於黑色表面,材質常數
的值是 0,對於白色表面,材質常數
的值是 1。當入射光的方向和物體表面法線的夾角有關,夾角越小,越接近法線,那麼接受到的光強也就越多,就越亮。此時的dot乘積也就越大。(回想cos的函式)
(3),鏡面反射光強影響因素
鏡面反射通過觀察者方向 v 來計算鏡面反射,如果 v 接近於 r,反射的強度也會變大(同時也受光澤度
影響),根據 r 與 v 角度余弦值的
-th 次方(pow 值)來生成不同光澤的亮點,我們需要限制負余弦的值為 0,此外鏡面反射還要求乙個材質顏色
(通常是白色)
2,**演練
shader "最後上效果圖jiki/vertexlighting_specular
" subshader
cgprogram
#pragma vertex vert
#pragma fragment frag#include
"unitycg.cginc
"uniform float4 _lightcolor0;
uniform float4 _color;
uniform
float
_shininess;
uniform float4 _speccolor;
struct
inputvertex
;struct
outputvertex
;outputvertex vert(inputvertex input)
else
//環境光
float3 ambientcolor=unity_lightmodel_ambient.rgb*_color.rgb;
//漫反射
float3 diffusecolor=attenuation*_lightcolor0.rgb*_color.rgb*max(0
,dot(normaldir,lightdir));
//鏡面高光
float3 specularcolor;
if(dot(lightdir,normaldir)<0)//
證明是背面
else
//混合
o.col=float4(ambientcolor+diffusecolor+specularcolor,1.0
); o.pos=mul(unity_matrix_mvp,input.vertex);
return
o; }
float4 frag(outputvertex input):color
endcg}}
}
上面**寫的有些簡陋,但個人覺得反映出來光照的原理了,有問題還請大家多多指正。
由於這個是基於頂點的,因此光照效果顯得有些粗糙,不夠細膩,後續將在fragment中去實現光照,那樣就會得到光滑的鏡面高光。敬請期待!!不早了該睡了哈哈
GLSL 逐頂點的光照
引言 在opengl中有三種型別的光 方向光 directional 點光 point 聚光 spotlight 本教程將從方向光講起,首先我們將使用glsl來模仿opengl中的光。我們將向shader中逐漸新增環境光 散射光和高光效果。後面的教程中我們將使用逐畫素光照以獲得更好的效果。接下來我們...
GLSL教程 (六)逐頂點的光照
from 引言 在opengl中有三種型別的光 方向光 directional 點光 point 聚光 spotlight 本教程將從方向光講起,首先我們將使用glsl來模仿opengl中的光。我們將向shader中逐漸新增環境光 散射光和高光效果。後面的教程中我們將使用逐畫素光照以獲得更好的效果。...
第九作坊中的畫素光照實現
畫素光照 與固定管線不同,使用可程式設計管線可以實現靈活多樣的渲染效果。然而事物總有兩面,使用可程式設計管線就必須編寫shader程式。本節的內容將以分析實現各種效果的shader為主,在此之前有必要簡單說明shader的使用方法。下面的偽 說明了如何使用id3dxeffect介面執行shader程...