Seite 1 von 2

Refraction (Raytracing)

Verfasst: 28.11.2005 18:30
von Spirit
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:

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

Verfasst: 28.11.2005 20:55
von NicTheQuick
Cool, Konkurrenz! :allright:

Verfasst: 28.11.2005 21:25
von Kaeru Gaman
schau mal in die Help zu PovRay (zu finden auf www.povray.org )

unter der erklärung von refraction müssten auch formel und schaubild zu finden sein...

Verfasst: 28.11.2005 21:34
von Batze
NicTheQuick hat geschrieben:Cool, Konkurrenz! :allright:
Ich wollt grad sagen: "Macht nicht NTQ schon sowas?"
@Nic: Aber hast du dich nicht auf Echtzeitraytracing spezialisiert? :?

Verfasst: 28.11.2005 21:48
von DarkDragon
Batze hat geschrieben:
NicTheQuick hat geschrieben:Cool, Konkurrenz! :allright:
Ich wollt grad sagen: "Macht nicht NTQ schon sowas?"
@Nic: Aber hast du dich nicht auf Echtzeitraytracing spezialisiert? :?
Raytracing ist ja auch nicht für Echtzeit gedacht.

Verfasst: 28.11.2005 22:12
von Kaeru Gaman
DarkDragon hat geschrieben:Raytracing ist ja auch nicht für Echtzeit gedacht.
Schmarrn!

echtzeit-ratracing is die zukunft, wenn die technik weit genug ist, ist OGL & co tot.

Verfasst: 28.11.2005 22:28
von Kekskiller
Ach Quatsch, das heißt dann ganz einfach nur ORTL :lol:

Verfasst: 28.11.2005 22:32
von Kaeru Gaman
es heißt auch OpenRT -> http://www.openrt.de/

der gag ist ja, dass OGL nur entwickelt wurde, weil die hardware nicht
leistungsfähig genug war für Realtime-Raytracing.

grundsätzlich ist das prinzip von OGL ähnlich, nur reduziert,
dadurch wird ein geschwindigkeitsgewinn gegenüber vollständigem RT erreicht.

Verfasst: 28.11.2005 22:41
von Spirit
Kaeru Gaman hat geschrieben:schau mal in die Help zu PovRay (zu finden auf www.povray.org )

unter der erklärung von refraction müssten auch formel und schaubild zu finden sein...
Das einzige, was ich in der Hilfe gefunden habe, ist das hier:
http://www.povray.org/documentation/view/3.6.1/414/
Da ist leider keine Formel angegeben.
NicTheQuick hat geschrieben:Cool, Konkurrenz! :allright:
Wohl eher nicht, meine Engine ist in C++ geschrieben. Natürlich hätte ich
auch PB nehmen können, aber ich wollte ein bisschen C++ üben, schließlich
bin ich ja da noch Anfänger.

Falls es interessiert, die Engine unterstützt derzeit folgendes:
Kugeln
Ebenen
Dreiecke
Schatten (nur harte Schatten)
Area lights
Point lights
Spot lights (harte und weiche)
Reflektionen

Tja, und was jetzt noch fehlt ist eben die Brechung...

Verfasst: 28.11.2005 23:11
von Batze
DarkDragon hat geschrieben: Raytracing ist ja auch nicht für Echtzeit gedacht.
Dachte ich auch, bevor da mal ein Thread war, wo es um Echtzeit-Raytracing-Chips ging.