问题描述
// Inputs from application.
// Generally,"in" like the position and normal vectors for things that change frequently,// and "uniform" for things that change less often (think scene versus vertices).
in vec3 position_cam,normal_cam;
uniform mat4 view_mat;
// This light setup would usually be passed in from the application.
vec3 light_position_world = vec3 (10.0,25.0,10.0);
vec3 Ls = vec3 (1.0,1.0,1.0); // neutral,full specular color of light
vec3 Ld = vec3 (0.8,0.8,0.8); // neutral,lessened diffuse light color of light
vec3 La = vec3 (0.12,0.12,0.12); // ambient color of light - just a bit more than dk gray bg
// Surface reflectance properties for phong model below.
vec3 Ks = vec3 (1.0,1.0); // fully reflect specular light
vec3 Kd = vec3 (0.32,0.18,0.5); // purple diffuse surface reflectance
vec3 Ka = vec3 (1.0,1.0); // fully reflect ambient light
float specular_exponent = 400.0; // specular 'power' -- controls "roll-off"
// Shader programs can also designate outputs.
out vec4 fragment_color; // color of surface to draw in this case
void main ()
{
fragment_color = vec4 (Kd,1.0);
}
我有两个问题:
解决方法
在glsl中,您可以使用数组和结构。定义光源阵列。参见Array constructors和Struct constructors:
const int no_of_lights = 2;
struct TLightSource
{
vec3 lightPos;
vec3 Ls;
vec3 Ld;
vec3 La;
float shininess;
};
TLightSource lightSources[no_of_lights] = TLightSource[no_of_lights](
TLightSource(vec3(10.0,25.0,10.0),vec3(1.0,1.0,1.0),vec3(0.8,0.8,0.8),vec3(0.12,0.12,0.12),TLightSource(vec3(-10.0,0.0,0.0),10.0)
);
用户使用for循环遍历光源并汇总环境光,漫反射光和镜面光(例如Phong reflection model)的光色:
void main()
{
vec3 normalInterp;
vec3 vertPos;
vec3 normal = normalize(normalInterp);
vec3 color = vec3(0.0);
for (int i=0; i < no_of_lights; i++)
{
color += Ka * lightSources[i].La;
vec3 lightDir = normalize(lightSources[i].lightPos - vertPos);
float lambertian = max(dot(lightDir,normal),0.0);
color += lambertian * lightSources[i].Ld;
if (lambertian > 0.0)
{
vec3 viewDir = normalize(-vertPos);
vec3 reflectDir = reflect(-lightDir,normal);
float RdotV = max(dot(reflectDir,viewDir),0.0);
float specular = pow(RdotV,lightSources[i].shininess/4.0);
color += specular * lightSources[i].Ls;
}
}
frag_color = vec4(color,1.0);
}