Refraction (Raytracing)
Verfasst: 28.11.2005 18:30
Ich schreibe gerade einen Raytracer, der auf den Tutorials basiert, die man hier
downloaden kann. Alles funktioniert auch so weit, nur die Brechung bei
durchsichtigen Objekten scheint irgendwie nicht korrekt berechnet zu
werden.
Hier ist das Stück Code, das die Brechung berechnet:
Es wäre schön, wenn jemand einen Code posten könnte, der die Brechung
richtig berechnet (entweder in PB oder C++, ist mir egal).
downloaden kann. Alles funktioniert auch so weit, nur die Brechung bei
durchsichtigen Objekten scheint irgendwie nicht korrekt berechnet zu
werden.
Hier ist das Stück Code, das die Brechung berechnet:
Code: Alles auswählen
float refractR = 0, refractG = 0, refractB = 0;
Ray refractRay;
CVector4 I, negI, newNormal;
float cosI = 0;
float cosT = 0;
newNormal = normal;
newNormal.x *= -1; newNormal.y *= -1; newNormal.z *= -1;
I = RayShapeIntersect - ray.origin;
negI = CVector4(-I.x, -I.y, -I.z);
I.Normal();
negI.Normal();
refractRay.origin = ray.origin;
cosI = negI.DotProduct3(newNormal);
cosT = 1.0f - refractVal * refractVal * (1.0f - cosI * cosI);
refractRay.direction.x = refractVal * I.x +
((refractVal * cosI - sqrt(fabs(cosT))) * newNormal.x);
refractRay.direction.y = refractVal * I.y +
((refractVal * cosI - sqrt(fabs(cosT))) * newNormal.y);
refractRay.direction.z = refractVal * I.z +
((refractVal * cosI - sqrt(fabs(cosT))) * newNormal.z);
refractRay.direction.Normal();
if(refractVal > 0)
{
if(g_RecurseLevel <= MAX_RECURSION)
{
g_RecurseLevel++;
TraceScene(shape, totalShapes, lights, totalLights, refractRay,
refractR, refractG, refractB);
g_RecurseLevel--;
r += refractR * refractVal;
g += refractG * refractVal;
b += refractB * refractVal;
}
}
richtig berechnet (entweder in PB oder C++, ist mir egal).