Vertex中實現每頂點光照的鏡面高光效果

2022-04-02 06:41:33 字數 2040 閱讀 4733

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程...