Diese Anzeige ist nur für
Nicht-Mitglieder sichtbar!

Jetzt kostenlos registrieren

C++ Renderer

Alle Meisterwerke, die nicht in die anderen Kategorien passen, gehören hier hin. (Film, Spiel usw.)

Moderator: Basti

C++ Renderer

Beitragvon frmimue am 02.05.2011, 14:31

Hallo Leute, da ich zurzeit Abitur mache, hatt man ja ab und zu mal Langeweile...
Also ist mir zwischendurch die Idee gekommen, da ich etwas mit Grafikprogrammierung machen wollte, einen eigenen kleinen Renderer zu programmieren.

Dies ist die allererste PreAlpha, und ist eigentlich nur dafür da, um den Algorythmus zu testen, aber ich will sie euch dennoch nicht vorenthalten, am besten auf die nächste Version warten. Die .exe erzeugt ein Bitmap-File in der Größe 800x600, und Rendert eine blaue Kugel die bei 0,0,0 liegt, die Kamera wurde um 10 Einheiten auf der Y-Achse nach hinten gefahren, und blickt auf die Kugel.

Das BMP heißt testbmp und wird bei jeder Ausführung überschrieben!

Sollte jemand Interesse am lesbarem Algorythmus haben, werde ich ihn auch noch mal in Pseudocode aufschreiben, einfach melden :mrgreen:

Anforderungen an PreAlpha2:
Programmierung Objekt Orientiert ausrichten -> Alles schön in Klassen verpacken.
Programmierung Objekt-Name funktionell und leserlich machen.
Programmcode optimieren-> Vorausberechnungen.
Eingabe der Auflösung, Kameraposition, Kugelpostion, Kugelradius, Kugelfarbe.
Eingabe des Bilddateinamens und Überschreiben nur nach Abfrage.

Anforderungen an PreAlpha3:
Berechnung von Schatten


Wer sich für den Algorythmus interressiert:

Berchnung der Richtung eines Strahles
(Hatte irgendwie was anderes im Kopf: vertex = vector)
Code: Alles auswählen
vertex raydir(kamera k, int j, int i){
   float mb = 2.0f/k.aufloesung.breite;
   float mh = -2.0f/k.aufloesung.hoehe;
   vertex v = ((k.richtung*100.0f)+(k.rechts*(((i+1)*mb-1.0f)*k.sichtfeld.horizonzal))
                                                     +(k.oben*(((j+1)*mh+1.0f)*k.sichtfeld.vertikal)));
   return v;
};


Berechnung des Abstandes² von der Kugel
Code: Alles auswählen
float dist2(vertex a, vertex b, vertex c){
   float d = 0.0f;
   vertex v,w;
   v = c-a;
   float sqr;
   sqr = b.x*b.x+b.y*b.y+b.z*b.z;
   float sqr2 = sqrt(sqr);
   vertex bb = b/sqr2;
   w = v*bb;
   d = w.x*w.x+w.y*w.y+w.z*w.z;
   return d;
};

PathRay(PreAlpha1).zip
(9.61 KiB) 13-mal heruntergeladen
frmimue
Mitglied
 
Beiträge: 31
Registriert: 19.04.2009, 17:25
Diese Anzeige ist nur für
Nicht-Mitglieder sichtbar!
 
Jetzt kostenlos registrieren

Re: C++ Renderer

Beitragvon Rudi Media am 03.05.2011, 19:01

Sehr schön!
Wollte mich selbst auch mal am Raytracing versuchen, bin aber irgendwie nie dazu gekommen ^^
http://www.RudiMedia.com
If there are two or more ways to do something, and one of those ways can result in a catastrophe, someone will do it.
(Murphys Gesetz)

Bild
Benutzeravatar
Rudi Media
Mitglied
 
Beiträge: 415
Registriert: 04.05.2008, 16:44
Wohnort: Schwäbische Alb

Re: C++ Renderer

Beitragvon frmimue am 04.05.2011, 16:20

So Leute die PreAlpha2 ist fertisch :mrgreen: !
Ihr könnt bereits folgende Einstellungen vornehmen:
1. Einstellen der Renderbildgröße(0-4000;0-4000)
2. Einstellen der Hintergrundfarbe(0-255;0-255;0-255)
3. Einstellen der Kugelfarbe(0-255;0-255;0-255)
4. Einstellen der Kugelgröße(0.0-5.0)
5. Eingabe des Bildnamens (name) [.bmp wird selbstädig angehängt]

Die Angaben in Klammern sollten beachtet werden, und werden nicht überprüft, da es noch PreAlpha Status hat!

PreAlpha1: 154 Zeilen Code
PreAlpha2: 223 Zeilen Code

Anforderungen an PreAlpha3
Berechnung von Schatten & Licht
Berechnung von Ebenen

Anforderunden an Alpha1
Berechnung von Polygonen

Anforderungen an Alpha2
Einlesen von Scenendateien


Für Codeinterressierte:

Es gibt einen Header für die Raytracer Klasse, einen für alle Structs, wie Farbe, Kugel, Vector, Kamera..., und einen Header, die die Klasse für die BitMap-Verwaltung enthält.

Dem Raytracer werden dann die Kugel, die Kamera und die Bitmap einstellungen übergeben und das Bild errechnet.

Der Algorythmus zur Berechnung der Strahlenrichtung wurde von mir auch weiter Optimiert:

Code: Alles auswählen
inline Vector Raytracer::raydirection(Cam cam1, int x, int y){
   float mb = 2.0f*cam1.fieldofview.width/cam1.resolution.width;
   float mh = -2.0f*cam1.fieldofview.height/cam1.resolution.height;
   Vector v = ((cam1.direction*100.0f)+(cam1.directionright*(mb*x-cam1.fieldofview.width)))+(cam1.directionup*(mh*y+cam1.fieldofview.height));
   return v;
};


Geschwindigkeitsoptimierungen werde ich erst vornehmen, wenn ich einen Timer integriert habe, um zu testen, wieviel diese dann wirklich bringen.

PathRay(PreAlpha2).zip
(12.37 KiB) 12-mal heruntergeladen
frmimue
Mitglied
 
Beiträge: 31
Registriert: 19.04.2009, 17:25

Re: C++ Renderer

Beitragvon frmimue am 08.05.2011, 13:39

So Leute, passend zum Muttertag: :mrgreen: PreAlpha3 ist ferig :mrgreen:

Einstellmöglichkeiten:
1. Einstellen der Renderbildgröße(0-4000;0-4000)
2. Einstellen der Hintergrundfarbe(0-255;0-255;0-255)
3. Einstellen der Kugelfarbe(0-255;0-255;0-255)
4. Einstellen der Ebenenfarbe(0-255;0-255;0-255)
5. Einstellen der Kugelgröße(0.0-5.0)
6. Eingabe des Bildnamens (name) [.bmp wird selbstädig angehängt]
Die Angaben in Klammern sollten beachtet werden, und werden nicht überprüft, da es noch PreAlpha Status hat!

PreAlpha1: 154 Zeilen Code
PreAlpha2: 223 Zeilen Code
PreAlpha3: 325 Zeilen Code

!Achtung, die die alte PreAlpha3 hatte einen fehler, so dass nur quadratische Bilder lesbar waren.
Der Fehler ist behoben und diese PreAlpha3 ist aktualisiert!

PathRay(PreAlpha3).zip
(13.46 KiB) 9-mal heruntergeladen


Hier eine kleine Bildreihe, einmal von Vorne,Rechts,Hinten & Links
Clipboard.jpg
(11.6 KiB) 36-mal heruntergeladen


Jeder der Ideen hat, unbedingt bitte posten!

Erledigt:
Berechnen von Kugeln
Berechnen von Ebenen
Schattenberechnung
Punktlichtquelle

Nächste Ziele:
Einlesen von Scenendateien
Diffuse Reflexion -> Lambertsches Gesetz
Zeitmessung
frmimue
Mitglied
 
Beiträge: 31
Registriert: 19.04.2009, 17:25

Re: C++ Renderer

Beitragvon frmimue am 09.05.2011, 12:52

:mrgreen: PreAlpha 4 ist fertig :mrgreen:

Eigentlich mit nur wenigen, kleinen Veränderungen, die aber das Ergebnis so stark beeinflussen, dass ich eine neue Version poste.

Einstellmöglichkeiten:
1. Einstellen der Renderbildgröße(0-4000;0-4000)
2. Einstellen der Hintergrundfarbe(0-255;0-255;0-255)
3. Einstellen der Kugelfarbe(0-255;0-255;0-255)
4. Einstellen der Ebenenfarbe(0-255;0-255;0-255)
5. Einstellen der Kugelgröße(0.0-5.0)
6. Eingabe des Bildnamens (name) [.bmp wird selbstädig angehängt]
Die Angaben in Klammern sollten beachtet werden, und werden nicht überprüft, da es noch PreAlpha Status hat!

PreAlpha1: 154 Zeilen Code
PreAlpha2: 223 Zeilen Code
PreAlpha3: 325 Zeilen Code
PreAlpha4: 342 Zeilen Code

PathRay(PreAlpha4).zip
(14.32 KiB) 13-mal heruntergeladen


Und hier eine Vorschau:
test.jpg
(21.13 KiB) 41-mal heruntergeladen


Erledigt:
Berechnen von Kugeln
Berechnen von Ebenen
Schattenberechnung
Punktlichtquelle
Diffuse Beleuchtung


Nächste Ziele:
Zeitmessung -> PreAlpha5
Einlesen von Scenendateien -> Alpha1
frmimue
Mitglied
 
Beiträge: 31
Registriert: 19.04.2009, 17:25

Re: C++ Renderer

Beitragvon Basti am 09.05.2011, 13:06

Interessantes Projekt! :thumbsup:
Scheinbar kommst du mit der Entwicklung zur Zeit gut voran. Schön finde ich auch, dass du die Versionen ein wenig dokumentierst und stets eine kleine Roadmap aufstellst.
Benutzeravatar
Basti
Site Admin
 
Beiträge: 3075
Registriert: 15.06.2006, 17:33
Wohnort: Kaiserslautern

Re: C++ Renderer

Beitragvon Herbie am 09.05.2011, 17:07

Respekt! Der Fortschritt von Clipboard.jpg zu test.jpg ist gewaltig.
Benutzeravatar
Herbie
Mitglied
 
Beiträge: 1881
Registriert: 02.10.2005, 20:44

Re: C++ Renderer

Beitragvon frmimue am 09.05.2011, 18:08

Und dabei musste ich nur alle Richtungsvektoren normalisieren und
das Skalarprodukt aus Ebenen/Kugelnormale und Lichtnormale nehmen und als Faktor benutzen.
frmimue
Mitglied
 
Beiträge: 31
Registriert: 19.04.2009, 17:25

Re: C++ Renderer

Beitragvon Herbie am 09.05.2011, 19:16

"nur" ... :P
Ich weiß nicht mal, was ein Skalarprodukt ist.
Benutzeravatar
Herbie
Mitglied
 
Beiträge: 1881
Registriert: 02.10.2005, 20:44

Re: C++ Renderer

Beitragvon frmimue am 20.05.2011, 11:06

So Leute es wird etwas dauern, bis es eine neue Version gibt, da meine Festplatte vor nen paar Tagen durchgebrannt ist und leider der komplette Code flöten gegangen ist :xx: :(
Montag kommt erstmal ne neue Festplatte und dann schau ich mal ob ich noch was retten kann, sieht aber schlecht aus.

Zum glück habe ich noch einiges aufem Block aufgeschrieben, trotzdem ist es ärgerlich.
frmimue
Mitglied
 
Beiträge: 31
Registriert: 19.04.2009, 17:25

Re: C++ Renderer

Beitragvon Basti am 20.05.2011, 12:10

Das ist wirklich ärgerlich, dann wünsche ich dir auf jeden Fall Glück für die Datenrettung.

Für solche Fälle ist es immer gut, sich einen USB-Stick oder eine externe Festplatte zuzulegen, damit wichtige Dateien immer auf mehreren Datenträgern gesichert werden können. Ich weiß aber selbst, wie schwierig es ist, sich zu regelmäßigen Backups zu disziplinieren. ;)
Benutzeravatar
Basti
Site Admin
 
Beiträge: 3075
Registriert: 15.06.2006, 17:33
Wohnort: Kaiserslautern

Re: C++ Renderer

Beitragvon Herbie am 20.05.2011, 12:43

Aber unumgänglich!

Bei mir war die Wende, als ein damaliger Freund, ein dänischer Mitarbeiter bei IBM in Böblingen, zu mir sagte:

"You can never rely on a computer."

Das hat sich mir tief eingeprägt.
Benutzeravatar
Herbie
Mitglied
 
Beiträge: 1881
Registriert: 02.10.2005, 20:44

Re: C++ Renderer

Beitragvon Kühl am 01.06.2011, 09:50

Ein guter Tipp: Dropbox

Da ich viele wichtige Dokumente in der Universität schreibe die nicht verloren gehen dürfen, sichere ich alle mittels Dropbox. Dropbox synchronisiert einen lokalen Ordner mit dem Internet und lädt automatisch hoch/ runter wenn du etwas neues einfügst. So kannst du zB auf 2 PC's + im Internet dein Projekt speichern, ohne irgendeinen click. Geht auch mit mehreren Usern wenn man gemeinsam an einem Projekt arbeitet.

Ist mit 2GB Speicher kostenlos: http://db.tt/10sfcbX
MfG Kühl
Benutzeravatar
Kühl
Mitglied
 
Beiträge: 729
Registriert: 23.04.2007, 17:28
Wohnort: Bremen

Re: C++ Renderer

Beitragvon Manuel am 01.06.2011, 12:52

Oder aber SVN... das würde sich beim Coden sehr viel mehr empfehlen finde ich! Von mir aber auch mein tiefes Beileid... das ist echt extrem ärgerlich, aber lerne draus!! Das ist wichtig!
Webdesign Tutorial | Professionelles Webdesign

In dem Maße, wie der Wille und die Fähigkeit zur Selbstkritik steigen, hebt sich auch das Niveau der Kritik an anderen.
Christian Morgenstern
Benutzeravatar
Manuel
Site Admin
 
Beiträge: 11517
Registriert: 10.12.2004, 19:29

Re: C++ Renderer

Beitragvon frmimue am 02.06.2011, 09:44

Ich werd meine daten zumindest aufem USB-Stick ab jetzt speicher ....
Mittlerweile bin ich auch wieder auf dem Stand der 2. Alpha, nur eine Berechnung macht mir noch probleme, da muss ich mich nochmal mit beschäftigen
frmimue
Mitglied
 
Beiträge: 31
Registriert: 19.04.2009, 17:25


Zurück zu Sonstiges

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast