2017-07-26 11 views
2

Ich denke, diese sollten kreisförmig sein. Ich nehme an, dass etwas mit meiner Norm nicht stimmt, aber ich habe mit ihnen nichts falsch gemacht. Andererseits ist es schwierig, einen guten Test für die Normalen zu finden. HierWarum sind meine Glanzlichter elliptisch?

ist das Bild: enter image description here

Hier mein Shading-Code für jedes Licht ist, den rekursive Teil für Reflexionen Weglassen:

lighting = (hit.obj.ambient + hit.obj.emission); 
    const glm::vec3 view_direction = glm::normalize(eye - hit.pos); 
    const glm::vec3 reflection = glm::normalize((static_cast<float>(2) * (glm::dot(view_direction, hit.normal) * hit.normal)) - view_direction); 
    for(int i = 0; i < numused; ++i) 
    { 

     glm::vec3 hit_to_light = (lights[i].pos - hit.pos); 
     float dist = glm::length(hit_to_light); 
     glm::vec3 light_direction = glm::normalize(hit_to_light); 
     Ray lightray(hit.pos, light_direction); 
     Intersection blocked = Intersect(lightray, scene, verbose ? verbose : false); 
     if(blocked.dist >= dist) 
     { 
      glm::vec3 halfangle = glm::normalize(view_direction + light_direction); 
      float specular_multiplier = pow(std::max(glm::dot(halfangle,hit.normal), 0.f), shininess); 

      glm::vec3 attenuation_term = lights[i].rgb * (1.0f/(attenuation + dist * linear + dist*dist * quad)); 
      glm::vec3 diffuse_term = hit.obj.diffuse * (std::max(glm::dot(light_direction,hit.normal) , 0.f)); 
      glm::vec3 specular_term = hit.obj.specular * specular_multiplier; 
     } 
    } 

Und hier ist die Linie, wo ich den Objektraum verwandeln normalen für den Weltraum:

*norm = glm::normalize(transinv * glm::vec4(glm::normalize(p - sphere_center), 0)); 

das volle phong-Modell, statt blinn-phong, erhalte ich Teardrop-Highlights:

enter image description here

Wenn ich Farbpixel gemäß der (Absolutwert des) Normal am Schnittpunkt I folgendes Bild erhalten (r = x, g = y, b = z): enter image description here

+0

Wie schätzen Sie Ihre Normalen verwandeln? Da Sie wahrscheinlich mit Kugeln beginnen und sie ungleichmäßig skalieren, müssen Sie die transponierte Umkehrung anstelle der regulären Transformationsmatrix verwenden (siehe [diese Frage] (https://math.stackexchange.com/questions/924659/transformation-of) -a-surface-normal) für weitere Details) –

+0

Ich benutze die Transponierte Umkehrung, um die Normalen zu transformieren, und ich verwende 'glm :: transpose (glm :: inverse (object_transform))' also denke ich nicht die Matrix wird falsch berechnet. Ich werde die normale Transformationslinie zu dieser Frage hinzufügen, für den Fall, dass etwas schief geht. – user393454

+0

Obwohl es wahrscheinlich immer noch nicht die vollständige Lösung ist, haben Sie versucht, vom Blinn-Phong-Modell (das nur eine Näherung ist) zum vollen Phong-Modell zu wechseln, dh Punkt (Halbwinkel, Normal) durch Punkt zu ersetzen (Reflektion, Licht_Richtung)) '? –

Antwort

0

Ich habe dieses Problem gelöst. Es stellt sich heraus, dass die Normalen alle nur ein wenig aus sind, aber nicht genug, dass das von Normalen gefärbte Bild es darstellen könnte.

Ich fand dies durch Berechnung der Normalen auf Kugeln mit einer einheitlichen Skala und einer Übersetzung.

Das Problem in der Leitung aufgetreten, wo ich die Normalen Welt Raum transformiert:

*norm = glm::normalize(transinv * glm::vec4(glm::normalize(p - sphere_center), 0)); 

ich davon aus, dass die homogene wäre 0 nach der Koordinatentransformation, weil es null vorher war (Drehungen und Skalen beeinflussen nicht es, und weil es 0 ist, können auch keine Übersetzungen). Es ist jedoch nicht 0, weil die Matrix transponiert ist, so dass die untere Reihe mit den inversen Translationen gefüllt wurde, was dazu führte, dass die homogene Koordinate ungleich null war.

Der 4-Vektor wird dann normalisiert und das Ergebnis wird einem 3-Vektor zugewiesen. Der Konstruktor für den 3-Vektor entfernt einfach den letzten Eintrag, so dass der Normalwert nicht normalisiert wurde.

Hier ist das letzte Bild: enter image description here

Verwandte Themen