Refraction (Raytracing)

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Refraction (Raytracing)

Beitrag 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).
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Cool, Konkurrenz! :allright:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag 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? :?
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Ach Quatsch, das heißt dann ganz einfach nur ORTL :lol:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag 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...
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag 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.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Antworten