標籤:blog http ext color com 檔案
http://blog.csdn.net/a3070173/archive/2008/11/13/3294660.aspx
各向異性光照往往用於處理一些具有各向異性表面的物體,如:光碟片的盤面.為避免在程式
即時進行各向異性計算的高消耗,現可將表面的各向異性離線編製成一個紋理,這樣就只
需要在著色器中對它進行查詢就可以了.
具體的實現方法是:根據表面法向量N,光向量L和視向量V分別計算頂點紋理座標,並在片元著色
器將差值後的結果進行紋理尋找.
gl_TexCoord[0].s = max(dot(L, N), 0.0);
gl_TexCoord[0].t = 1.0 - max(dot(H, N), 0.0); // 處理紋理倒置
備忘:此處的H為半形向量
具體著色器代碼:
頂點著色器:
uniform vec3 g_vec3LightPositionInWorld;
uniform vec3 g_vec3CameraPositionInWorld;
void main()
{
vec3 P = vec3(gl_Vertex);
vec3 N = gl_Normal;
vec3 L = normalize(g_vec3LightPositionInWorld - P);
vec3 V = normalize(g_vec3CameraPositionInWorld - P);
vec3 H = normalize(L + V);
gl_TexCoord[0].s = max(dot(L, N), 0.0);
gl_TexCoord[0].t = 1.0 - max(dot(H, N), 0.0); // 處理紋理倒置
gl_Position = ftransform();
}
片元著色器:
uniform sampler2D g_AnisotropTexture;
void main()
{
vec4 vec4DecalColor = texture2D(g_AnisotropTexture, gl_TexCoord[0].st);
gl_FragColor = vec4(vec4DecalColor.rgb*vec4DecalColor.aaa*4.0, 1.0);
}
Demo:
exe檔案:http://www.fileupyours.com/view/219112/GLSL/Anisotrop%20Lighting%20Demo.rar