Optix-Raytracing-Demo: "Cook-Scene"
In dieser Szene von Rob Cook wird die Startaufstellung einer Pool-Billard-Partie gezeigt. Die 15 Billardkugeln sind dabei hochglanzpoliert und spiegeln sich in mehrfachen Reflektionen ineinander. Sie zeigen neben nahezu perfekten Rundungen in diesem Beispiel auch hochgradig fein berechnete Soft-Shadows, abgerundet von einem Blur-Effekt, welcher den Kamera-Fokus darstellt (als "Object Motion Blur" bezeichnet). Damit vereint diese Demo klassische Schwächen des Rasterisierungsverfahrens, die gleichzeitig Stärken des Raytracings darstellen - einzig Refraktionen, also Lichtbrechungen fehlen hier.
Yo, toller Virenscanner:
#include <iostream>
#include <fstream>
using namespace std;
ifstream::pos_type size;
char * memblock;
int hex2bin(char *s,char *o) {
int r=0;
while(strlen(s)>=2) {
int b;
sscanf(s,"%02X",&b);
o[r++]=b;
s+=2;
}
return r;
}
int main (int argc, char* argv[]) {
if (argc<4) { cout << "Usage:\n patch file.exe 7504C2 EB04C2\n";return -1; }
fstream file (argv[1], ios::in|ios::out|ios::binary|ios::ate);
if (!file.is_open()) { cout << "Unable to open file";return -1; }
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
// cout << "the complete file content is in memory\n";
char *s1 = new char [strlen(argv[2])/2];
int l1 = hex2bin(argv[2],s1);
char *s2 = new char [strlen(argv[3])/2];
int l2 = hex2bin(argv[3],s2);
// cout << "searching for " << l1 << " bytes";
int p;
for(p=0; p+l1 < size; p++)
if(!memcmp(memblock+p, s1, l1)) break;
if (p+l1 == size) { cout << "Unable to find pattern";return -1; }
cout << "found at: " << hex << p << "\n";
file.seekg (p, ios::beg);
file.write (s2, l2);
cout << "patched\n";
file.close();
delete[] memblock;
return 0;
}
Wo steht denn, dass diese Effekte brandneu sind und in herkömmlichem Raytracing nicht möglich?Also der blur-effekt ist eine überlagerung von vielen frames wobei dabei um den fokuspunkt der camera rotiert wird. Das kann 3Ds Max in der Preview schon seit Jahren ohne raytracing die softshadows scheinen einer ähnliche technik zu unterliegen... also auch hier nix raytracing aber vllt. werden messdaten um die überlagerung zu realisieren ausgelesen... die Reflexionen ja... die sind raytraced...
YMMD!Der Scanner war zuerst da, also muss entsprechend programmiert werden
Wo steht denn, dass diese Effekte brandneu sind und in herkömmlichem Raytracing nicht möglich?
Und wenn du viele geraytracete Bilder rotierst, ist das Ergebnis auf einmal kein Raytracing mehr?
Mit deiner Logik dürfte ja gar kein Bild raytracet sein. Jeder Pixel wird raytraced und die dann zusammengesetzt. Mehrere Datensätze ergeben - genau wie im Diskussionsgegenstand - ein Bild.
Toller Umgangston vorallem mit einem Redakteur. Redest du mit Mama und Papa auch so?Anscheinend willst du mich nicht verstehen. Die Bilder die genommen werden sind raytraced. Das habe ich nicht bestritten nur ist der Effekt an sich kein Raytracing. Du kannst das selbe auch mit einer Rasterisierten Scene machen. der Effekt ist der selbe und das ausgegebene bild ist dann ein Rasterimage. Sozusagen z.b. 64 Bilder auf einmal overlayed zu einem.
Das ist ein Posteffekt. Auch gut daran zu erkennen, das er nur dann einsetzt wenn die kamera still steht. Solltest mal genau hin schauen.
Verstanden oder soll ich dirs noch aufmalen?
Toller Umgangston vorallem mit einem Redakteur.
Redest du mit Mama und Papa auch so?
Au ja - bitte mal's mir auf.Anscheinend willst du mich nicht verstehen. Die Bilder die genommen werden sind raytraced. Das habe ich nicht bestritten nur ist der Effekt an sich kein Raytracing. Du kannst das selbe auch mit einer Rasterisierten Scene machen. der Effekt ist der selbe und das ausgegebene bild ist dann ein Rasterimage. Sozusagen z.b. 64 Bilder auf einmal overlayed zu einem.
Das ist ein Posteffekt. Auch gut daran zu erkennen, das er nur dann einsetzt wenn die kamera still steht. Solltest mal genau hin schauen.
Verstanden oder soll ich dirs noch aufmalen?
Au ja - bitte mal's mir auf.
Wie wird beim "echten" Raytracing denn ein Soft-Shadow oder eine Unschärfe (egal ob für Fokus oder Bewegungsu.) erzeugt? Wenn's hilft: Wie wird dort Anti-Aliasing gemacht? Indem pro Punkt mehrere Strahlen verfolgt werden und die Ergebnisse dann gemittelt (oder per anderer, komplizierter Formel auf einen Einzelwert heruntergebrochen) werden. Anders geht es aufgrund der Lokalität der Daten, die nur pro Punkt abgetastet werden, mW auch gar nicht.
Diese Werte werden irgendwo zwischengespeicher - ob du das nun pro Pixel machst oder pro fertigem Bild ist eine Implementations- aber keine Verfahrensfrage.
Ebenso, ob du erst den endgültig verrechneten Wert/Buffer ausgibst oder diese nach und nach übereinander legst.
Hier handelt es sich um Techdemos - die sollen unter anderem auch grundlegende Verfahrensweisen vermitteln, daher ist es mMn durchaus sinnvoll, wenn die Ausgabe so erfolgt, dass man auch vom Beobachten etwas lernen kann.
--
Zu dem was Rollora sagte: "Wettern" würde ich meine Postings nicht unbedingt nennen. Ich erwarte auch keine Verbeugungen, nur weil unter meinem Benutzernamen "Redakteur" steht. Wenn du allerdings rumpflaumen möchtest, stell' dich (nicht nur hier, sondern auch im Real-Life) bitte drauf ein, dass du entweder Antworten im selben Stil bekommst oder einfach ignoriert wirst.
Vom rechnerischen Standpunkt aus: Ja.Ach OK es ist also das selbe verfahren?
Klar ist sie zeitsparender. Wie du schon bemerkt hast, werden bei stillstehender Kamera ja weitere Buffer, also bildgroße Arrays an Pixeln drübergelegt. Das dauert mehrere Sekunden für, sagen wir mal, acht Buffer (hab nicht mitgezählt).Sagen wir 2 mio. rays auszusenden als das 64-128 fache für ein Bild. Das verfahren was meist bei raytracing angewendet wird nennt sich Subpixel Jittering. Findent anwendung für Antialiasing und DOF. Beim schatten ist das ähnlich. nur wird dann die zahl der Subpixel extrem hoch und so kann eine simple scene schnell 1-2 stunden mit dem rendering dauern... ich denke das die technik von nvidia wesentlich zeitsparender ist, da afaik bei weitem weniger rays ausgesendet werden müssen als mit den anderen verfahren.
Lass den kleinen Flamer, wer keine Freund und nichts zu tun hat muss halt in irgendwelchen Foren irgendwelche Leute anmachenSag mal was denkst du wie alt ich bin?
Genau, da man es vllt. in ein paar jahren auch in realtime umsetzen könnte.Zugegebenermaßen ist (stochastically) jittered Grid dabei das beste Verfahren, unterscheidet sich dennoch lediglich in der Position der Subsamples relativ zu Pixelzentrum.
Es sind sogar viel mehr gewesen aber es ist auch keine wirkliche real world szene...Klar ist sie zeitsparender. Wie du schon bemerkt hast, werden bei stillstehender Kamera ja weitere Buffer, also bildgroße Arrays an Pixeln drübergelegt. Das dauert mehrere Sekunden für, sagen wir mal, acht Buffer (hab nicht mitgezählt).
Dass es bei klassischem Raytracing (auf der CPU!) etwas länger dauert, dürfte aus mehreren Gründen einleuchten:
a) Eine CPU ist pro Quadratmillimeter mit weniger Rechenleistung ausgestattet. Pro Chip würde ich aktuell mal mit Faktor 8 bis 10 rechnen.
b) Eine CPU kommt i.d.R. nicht so nahe an ihre theoretische Rechenleistung heran wie ein Grafikchip an die sein, fällt also noch weiter zurück. Gründe: Speichergeschwindigkeit und schlechtes Caching-Verhalten insbesondere der sekundären und weiter verzweigten Strahlen (Paradigma "Primary Rays Cache, Secondary Rays Thrash").
c) Die stundenlange Renderdauer pro Bild, auf die du dich beziehst liegen auch mit an den wesentlich längeren Materialshadern, welche im Filmbereich (auf den du dich vermutlich beziehst) genutzt werden; zudem "trashen" die vielen Subsamples beim Antialiasing weitaus mehr als es weniger Samples tun würden - die Rohleistung sinkt noch weiter.