我正在尝试使用Processing
在场景的顶部实现2个聚光灯,这些聚光灯会随着时间的推移更改其各自的方向。我尝试使用默认的Spotlight(r,g,b,x,y,z,nx,ny,nz,angle,concentration)方法创建聚光灯,并尝试更改nx,ny和nz变量以更改光的方向。但是,该方法似乎没有考虑3个变量。这是我正在使用的glsl。
precision mediump float;
varying vec3 normalInterp;
varying vec3 vertPos;
uniform int lightCount;
uniform vec4 lightPosition[8];
uniform vec3 lightNormal[8];
//ambient
const vec3 ambientColor = vec3(0.1, 0, 0);
//diffuse
const vec3 diffuseColor = vec3(0.5, 0.0, 0.0);
//specular
const vec3 specColor = vec3(1.0, 1.0, 1.0);
//specular reflection parameter
const float n = 30.0;
//Depth cueing
//not implemented
void main() {
float lightR = 0.0;
float lightG = 0.0;
float lightB = 0.0;
for (int i = 0; i < lightCount; i++)
{
vec3 normal = normalize(normalInterp);
vec3 lightDir = normalize(lightPostion[i] - vertPos);
//diffuse
float diffuse = max(dot(lightDir,normal), 0.0);
//specular
float specular = 0.0;
if(diffuse > 0.0) {
vec3 viewDir = normalize(-vertPos);
vec3 reflectDir = reflect(-lightDir, normal);
float specAngle = max(dot(reflectDir, viewDir), 0.0);
specular = pow(specAngle, n);
}
//Note: can add in depth cueing here
vec3 colorLinear = ambientColor +
diffuse * diffuseColor +
specular * specColor;
lightR += colorLinear.x;
lightG += colorLinear.y;
lightB += colorLinear.z;
}
gl_FragColor = vec4(lightR,lightG,lightB, 1.0);
}
着色器程序中有一个简单的问题。首先有一个错字。它必须是lightPosition
而不是lightPostion
。但这不是唯一的问题。
lightPosition[i]
的类型为vec4
,vertPos
的错字为vec3
。从vertPos
中减去lightPosition[i]
会导致错误。
要么您必须从vec3
构造一个lightPosition[i]
:
vec3 lightDir = normalize(lightPostion[i] - vertPos);
vec3 lightDir = normalize(vec3(lightPosition[i]) - vertPos);
或者您必须以lightPosition[i]
的形式获取x,y和z分量(请参阅Swizzling:]
vec3 lightDir = normalize(lightPosition[i].xyz - vertPos);
两种解决方案都得到相同的结果。