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?
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:
Wenn ich Farbpixel gemäß der (Absolutwert des) Normal am Schnittpunkt I folgendes Bild erhalten (r = x, g = y, b = z):
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) –
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
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)) '? –