您的位置:首页 > 其它

使用GLSL实现更多数量的局部光照

2008-07-02 11:16 399 查看
众所周知,OpenGL固定管线只提供了最多8盏灯光。如何使得自己的场景之中拥有更多的灯光效果呢?

这里提供一种使用GLSL shader实现更多数量的局部光照。

在GLSL里,首先建立光照参数数据结构:

struct myLightParams

const int maxLightCount = 32;

uniform myLightParams light[maxLightCount];

uniform bool bLocalViewer;

uniform bool bSeperateSpecualr;

主函数:

void main()

void DirectionalLight(int i, vec3 eye, vec3 epos, vec3 normal,

inout vec4 amb, inout vec4 diff, inout vec4 spec)

void PointLight(int i, vec3 eye, vec3 epos, vec3 normal,

inout vec4 amb, inout vec4 diff, inout vec4 spec)

void SpotLight(int i, vec3 eye, vec3 epos, vec3 normal,

inout vec4 amb, inout vec4 diff, inout vec4 spec)

{

vec3 VP = vec3(light[i].position) - epos;

float d = length(VP);

VP = normalize(VP);

float att = 1.0/(light[i].constantAttenuation + light[i].linearAttenuation*d + light[i].quadraticAttenuation*d*d);

float dotSpot = dot(-VP, normalize(light[i].spotDirection));

float cosCutoff = cos(light[i].spotCutoff*3.1415926/180.0);

float spotAtt = 0;

if (dotSpot < cosCutoff)

spotAtt = 0;

else

spotAtt = pow(dotSpot, light[i].spotExponent);

att *= spotAtt;

vec3 h = normalize(VP+eye);

float dotVP = max(0, dot(normal, VP));

float dotHV = max(0, dot(normal, h));

amb += light[i].ambient * att;

diff += light[i].diffuse * dotVP * att;

spec += light[i].specular * pow(dotHV, gl_FrontMaterial.shininess) * att;

}

这样,对于场景之中的任意对象,它所能够接受计算的光源就可以突破8个的限制了。

上述光照计算是遵循OpenGL spec的,因此与固定管线的效果是一致的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: