вчера я отправил это:Lambertian шейдер до сих пор не работает
Мой шейдер до сих пор не работает, я сделал некоторые отладки, чтобы попытаться найти причину. Когда я запускаю мою программу и ударил сферы, shader.shade (renderable.colour) называется и этот код выполняется:
public Colour shade(Intersection intersection, Light light){
Vector3D lightDirection = light.location.subtract(intersection.point);
lightDirection.normalise();
Normal normal = intersection.normal;
normal.normalise();
Colour finalColour = new Colour();
float lambCoef = (float) normal.dot(lightDirection);
if(lambCoef>0){
finalColour.r = Math.max(0.0f, diffuseColour.r * lambCoef * light.intensity.r);
finalColour.g = Math.max(0.0f, diffuseColour.g * lambCoef * light.intensity.g);
finalColour.b = Math.max(0.0f, diffuseColour.b * lambCoef * light.intensity.b);
}
return finalColour;
}
Я получаю различные значения для lambCoef каждый раз, но не очень много, например, для красной области, для точек около 20 пиксов друг от друга, я получаю: 0,9446402 0,94463843 0,9446326 0,94462925 для, чтобы получить нормальные для сферы я использую:
public Normal getNormalAt(Vector3D point) {
Normal normal = new Normal(point);
normal = normal.subtract(center);
normal = normal.multiply(-1);
normal.normalise();
return normal;
}
, который, кажется, работает. Тогда для моей точки и поперечной коды я использую:
public double dot(Vector3D vector){
return x*vector.x + y*vector.y +z*vector.z;
}
public double dot(Point3D point){
return x*point.x + y*point.y +z*point.z;
}
public double dot(Normal normal){
return x*normal.x + y*normal.y +z*normal.z;
}
public Vector3D cross(Vector3D vector) {
Vector3D crossedVector = new Vector3D();
crossedVector.x = y*vector.z - z*vector.y;
crossedVector.y = z*vector.x - x*vector.z;
crossedVector.z = x*vector.y - y*vector.x;
return crossedVector;
}
Что также кажется правильными. Любая помощь будет действительно оценена, и я буду рад предоставить дополнительную информацию, если это необходимо.
Я теперь получаю этот вид изображения:
Какого вида имеет смысл, так как самолет находится на гораздо меньший угол к сферам. Это все еще неправильно.