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).