- 各向异性光照往往用于处理一些具有各向异性表面的物体,如:光盘的盘面.为避免在程序
- 实时进行各向异性计算的高消耗,现可将表面的各向异性离线编制成一个纹理,这样就只
- 需要在着色器中对它进行查询就可以了.
- 具体的实现方法是:根据表面法向量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
GLSL实现简单硬件Anisotrop Lighting
最新推荐文章于 2016-10-31 19:13:46 发布