正在改变聚光灯的方向

问题描述 投票:1回答:1

我正在尝试使用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);
}
java glsl processing shader
1个回答
0
投票

着色器程序中有一个简单的问题。首先有一个错字。它必须是lightPosition而不是lightPostion。但这不是唯一的问题。

lightPosition[i]的类型为vec4vertPos的错字为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);

两种解决方案都得到相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.