2015-04-11 2 views
1

вчера я отправил это:Lambertian шейдер до сих пор не работает

Lambertian Shader not working

Мой шейдер до сих пор не работает, я сделал некоторые отладки, чтобы попытаться найти причину. Когда я запускаю мою программу и ударил сферы, 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; 

} 

Что также кажется правильными. Любая помощь будет действительно оценена, и я буду рад предоставить дополнительную информацию, если это необходимо.

Я теперь получаю этот вид изображения:

enter image description here

Какого вида имеет смысл, так как самолет находится на гораздо меньший угол к сферам. Это все еще неправильно.

ответ

0

+1 для использования дискретных Normal, Point и Vector классы. В вашем методе shade() он не выглядит так, как будто вы учитываете расстояние от источника света до точки пересечения. В принципе, вам нужны точки пересечения, которые находятся дальше от заданного света, чтобы получать меньше света, чем точки, которые ближе к свету. Вы можете вымыть это для точечных источников света, отрегулировав свет intensity в c/(distance * distance), где c - это эмпирически определенный коэффициент поправки на свечение (начинаются с 1, а затем корректируются вверх, если результат слишком темный), а distance - это расстояние между точечный источник света и точку пересечения. Когда я говорю «adjust», я имею в виду добавить этот термин к расчету finalColour, а не фактически изменить значение light.intensity.

Как только вы начнете работать, вы можете подумать о том, чтобы сэмплировать источники света с точки зрения PDF-файлов, вместо использования руткирования 1/d*d.

Смежные вопросы