ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4435020
Jetzt (Chat):
6 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-
"Yet Another Quake 3 BSP Viewer" von Marco Koegler (MK42)


Also, hierbei handelt es sich um 'Yet Another Quake 3 BSP Viewer' (tm). Jedoch wurde dieser BSP-Viewer um 'Per-Pixel Lighting' (mit diffusem Bump-Mapping) erweitert.

In allen Screenshots handelt es sich um den Quake 3 Level 'Batcula', welcher unter http://www.planetquake.com/nunuk/ zu finden ist (mit Erlaubnis des Autors verwendet). Es sind etwa 120 komplett dynamische Lichter in dem Level platziert worden. Die Framerate bleibt dabei auf einem 1,4 GHz Athlon mit GF3 über 30 FPS (Fillrate limitiert). Ich verwende keine großartigen Optimierungen (noch nicht mal das PVS ... Schande über mein Haupt) ... der Level wird Brute-Force gerendert
(obwohl die Lichtquellen gegen das View-Frustum geculled werden). Implementiert ist das ganze mit OpenGL ... und verwendet daher leider nVidia-spezifische Extensions :(

Ach ja, die Lichtquellen cachen die Dreiecke welche von Ihnen beeinflußt
werden. Nur wenn sie Ihre Größe oder Orientierung ändern, wird dieser Cache aktualisiert.

Ich unterscheide drei Arten von dynamischen Lichtquellen: Omni, Spotlight und Cubelight. Alle sind durch einen Falloff-Radius eingeschränkt und jede Lichtquelle wird in einem individuellen Pass gerendert. Ich berechne nur 'diffuse' Licht/Material-Interaktionen, also von der Betrachterposition unabhängige Beleuchtung. Der Code für 'specular'-Interaktionen ist auch drin, aber das Level wirkt dann eher wie 'Plastik'. Außerdem ist die Präzision der GF3, GF4 und Radeon 8xxx sehr eingeschränkt, wenn es um die notwendige Exponentierung geht (für
die Highlights). Eine Radeon 9700 ist da schon deutlich cooler :)

1. Omni-Lights:
Haben eine diffuse Farbe. Die meisten Lichter sind Omni-Lights.

2. Spotlights:
Projezieren eine beliebige Textur auf den Level. Sehr gut auf dem Screenshot unten-links zu sehen (Fadenkreuz projeziert auf den 'Batcula'-Kopf).

3. Cubelights:
Hier wird eine Cubemap in alle sechs Richtungen projeziert. Ich verwende das für die 'Disko-Kugel' (Die bunten Punkte zu sehen im Screenshot unten-links).

Nun zu den Bildern:

Oben-Links:
Fast das komplette Batcula-Level auf einmal ... war braucht da noch Lightmaps :)

Oben-Rechts:
Einer der Haupträume des Levels. Das Licht beim Jump-Pad verändert ständig die Farbe.

Unten-Links:
Hier sieht man das Bump-Mapping recht gut (Struktur der bläulichen Steine). Zudem wäre da noch das Spot- und Cube-Light in der Nähe von dem Batcula-Gesicht.

Unten-Rechts:
Debugging-Ausgabe ... hier werden kleine Wireframe-Spheres an der Position der Omni-Lights gezeichnet. Zu sehen sind glaube ich 18 Omni-Lights (wenn ich mich nicht verzählt habe).


Das Bild in Originalgröße und ohne JPG-Artefakte findet ihr unter:

http://www.uni-koblenz.de/~koegler/iotw.png (1.7 MB)

Eine nur auf nVidia-Karten (GF3 aufwärts) lauffähige Demo gibt es unter:

http://www.uni-koblenz.de/~koegler/techdemocd/bin/batcula.zip (7.9 MB)

Ich weiß, dass da noch ein paar Bugs drin sind ... (zum Beispiel verschwindet der Font, wenn zwei Spotlights in die Szene platziert werden). Auch stimmt der Tangent-Space bei manchen Dreiecken nicht
(erzeugt harte Kanten oder schwarze Dreicke) ... das liegt daran, dass ich den Level nicht neu trianguliere und manche Vertices in dem BSP-File geshared werden.

Hoffe es gefällt,
Marco







Von CodingCat am 06.02.2003, 15:09:41 Uhr
EDIT (bezog sich auf anderes Bild)

Von Mr.DX am 06.02.2003, 16:36:51 Uhr
EDIT (bezog sich auf anderes Bild)

Von Fireface am 17.02.2003, 10:35:47 Uhr
Respekt!
Besonders spannend finde ich, dass du Per-Pixel-Lighting verwendest.
Was hast du denn mit diesem Programm vor?
Soll das ein Spiel werden oder nur ne "kleine" Übung?

Ich find das jedenfalls toll!

Von int am 17.02.2003, 11:55:02 Uhr
sieht schon sehr geil aus, wie q3 eben ;)

Von ONeinONeill am 17.02.2003, 12:32:12 Uhr
Schaut gut aus. Respekt!

Die Demo klappt nicht. Wenn ich starte, dann wird das Prog direkt wieder beendet! Muss ich etwas beachten?

Von MK42 am 17.02.2003, 13:14:03 Uhr
@Fireface:
Das Programm ist etwa 5 Monate alt und war Teil meiner TechDemo-CD, die ich für Job-Bewerbungen rausgeschickt habe.

@ONeilONeill:
Evtl. mußt Du die Farbtiefe von Windows auf 32-bit setzen, ansonsten findet das Programm nur einen Software-Modus, welche nicht die notwendigen Extensions unterstützt.

-Marco

Von Michi am 17.02.2003, 13:27:22 Uhr
sieht gut aus!
nur die demo geht leider nicht, es wird nur kurz das fenster angezeigt und dann beendet das programm:
Zitat:
Engine: Initializing InputServer...
******* Engine Init Successful
SetVSync(0)
ERROR: Init failed
******* Engine Shutdown
Engine: Releasing mOpenGL(2b83a40)
Releasing mHRC(10000)...
Releasing mHDC(1401092e)...
Engine: Releasing mWindow(2b83400)
Engine: Releasing mSystem(69c568)
Unregistered window class...
Uninitialized COM...

bzw. auf 2. rechner:
Zitat:
Engine: Initializing InputServer...
******* Engine Init Successful
ERROR: Init failed
******* Engine Shutdown
Engine: Releasing mOpenGL(4b140b8)
Releasing mHRC(10000)...
Releasing mHDC(51010957)...
Engine: Releasing mWindow(75cbd8)
Engine: Releasing mSystem(75cab0)
Unregistered window class...
Uninitialized COM...

Von MK42 am 17.02.2003, 13:35:16 Uhr
@Michi: Interessant wäre, was davor ausgegeben wird (mal abgesehen von der Liste aller Extensions).

-Marco

Von Michi am 17.02.2003, 13:39:18 Uhr
pc1:
Zitat:
******* Engine PreInit
Engine: Creating System...
Registered window class!
Initialized COM!
******* Engine Init
Engine: Settings specified:
Resolution = 640x480 32 bpp
fullScreen = no
alpha = 8
stencil = 8
depth = 24
Engine: Creating Main Window...
Window created!
Engine: Creating OpenGL Context...
Got device context for window! (mHDC=49010859)
Created rendering context from mHDC! (mHRC=10000)
Got mode RGBA(8888) Z-DEPTH:24 STENCIL:8

Registering: WGL_EXT_swap_control
Registering: GL_ARB_multitexture
Registering: GL_EXT_compiled_vertex_array
Registering: GL_NV_vertex_program
Registering: GL_NV_register_combiners
Registering: GL_EXT_texture_env_combine
Registering: GL_EXT_texture_env_dot3


pc2:
Zitat:
******* Engine PreInit
Engine: Creating System...
Registered window class!
Initialized COM!
******* Engine Init
Engine: Settings specified:
Resolution = 640x480 32 bpp
fullScreen = no
alpha = 8
stencil = 8
depth = 24
Engine: Creating Main Window...
Window created!
Engine: Creating OpenGL Context...
Got device context for window! (mHDC=51010957)
Created rendering context from mHDC! (mHRC=10000)
Got mode RGBA(5658) Z-DEPTH:32 STENCIL:8

Von ONeinONeill am 17.02.2003, 13:58:12 Uhr
Hi,

hab auf 32 Bit.

PC:

Athlon XP 2400+ ( 2 GHz )
ATI Radeon 9700
256 MB DDR-Ram

Von mastervc am 17.02.2003, 14:31:08 Uhr
Auch wenn ich Quark scheiss finde (UT ROCKS DA HOUSE + ELITE (MOD IN ENTWICKLUNG)), nich schlecht, hau noch PSV rein und gib mir den source ;) (scherz)

cya

Von deckhead am 17.02.2003, 17:39:56 Uhr
@MK42:
Und hat es dir bei deiner Jobsuche geholfen, soviel Arbeit in die Engine zu stecken oder ist doch nur ein stinklangweiliger IT-Job draus geworden..

Von MK42 am 17.02.2003, 19:52:28 Uhr
@Michi: Was für eine Grafikkarte ist das? Scheint ja schonmal nVidia zu sein ... hmm, komisch?

@ONeilONeill: Deine Grafikkarte ist zu gut! Ich hatte in der Beschreibung gesagt, dass ich OpenGL mit 'nVidia-spezifischen'-Extensions verwende ... läuft daher nur für GF3 aufwärts ... nVidia only. Ich kann es mir auf meiner neuen Grafikkarte auch nicht mehr anschauen. Da muß man dann halt was besseres programmieren ...

@mastervc: Da der Code bei mir nach einem 'ATI-Upgrade' auch nicht mehr läuft pflege ich ihn auch nicht mehr.

@deckhead: Es hat geholfen ... ob es sich gelohnt hat, wird sich erst in den nächsten Monaten zeigen. Für 'Business-IT' hätte ich sowas nicht gemacht ;)

-Marco

Von Michi am 17.02.2003, 19:57:54 Uhr
1.pc: geforce 4 mx
2.pc: geforce 4 ti 4200

Von MK42 am 17.02.2003, 20:09:11 Uhr
@Michi:
1. Die GF 4 MX ist nur eine etwas aufgebohrte GF2 ... ich glaube ich verwende zu viele Register-Combiner und deshalb will das nicht ... oder zu viele Texture-Units.

2. Sollte klappen ... aber da scheint die Farbtiefe vom Desktop auf 16-bit gesetzt zu sein. Vorschlag: Setze einfach mal in der 'gateway.cfg' gw_fullscreen auf 1.

-Marco

Von Programmer Stefan am 17.02.2003, 21:08:42 Uhr
Das sieht wirklich gut aus, und laufen tut es auch nicht wirklich langsam. Ich habe eine Radeon9700 Pro(etwa 70FPS) und eine Radeon8500(etwa 40FPS) und auf beiden läuft die Demo. Dazu ist dann noch ein 1GB Ram und ein AthlonXP 1600+
Könnte es sein, dass ihr Powerstrip am laufen habt, denn ich hab das auch zuerst gehabt, dann hat es nicht funktioniert, und als ich es abschaltete funktionierte es.

Von MK42 am 17.02.2003, 22:46:59 Uhr
@ProgrammerStefan:

Ich glaube nicht, dass Du dieses Demo auf einer ATI-Karte zum Laufen gebracht hast ... ich hab das Ding schließlich programmiert und da ist 0 ATI-Code drin.

-Marco

Von simply am 17.02.2003, 23:21:10 Uhr
bei mir läufts, aber nur mit 10 fps, ist auch klar, habe nur eine 500 mhz cpu. dazu noch eine gf4 ti4200 und 384 mb ram.

ist das opensource? also ich würde mir den code gern mal anschauen, wenn du nichts dagegen hast, meine email istvilligerandy@gmx.ch . danke :)

Von ToyToy am 17.02.2003, 23:53:48 Uhr
Schau doch mal in die opengl32.dll, vielleicht hat ja ATI im aktuellen Treiber Nvidia Extensions eingebaut?

Von MK42 am 18.02.2003, 14:35:07 Uhr
@ToyToy: Sorry, aber sowas gibt es (meines Wissens) nicht. Hatte den 3.0 und habe jetzt den 3.1 Catalyst drauf und mit denen geht es definitiv nicht und das sind die einzigen öffentlichen Radeon 9700 Treiber. Wäre ja auch zu schön gewesen.

-Marco

Von Eisflamme am 18.02.2003, 17:26:53 Uhr
Sieht fantastisch aus. :)

Übrigens klappt es, dass es auf Katren unter GF3 nicht kalppt, meine GF2GTS schafft das nicht, prima. ;)

Von SiC am 18.02.2003, 17:41:45 Uhr
ich peil zwar den letzten post net aber egal.
Da die demo perpixel lightning benutzt wird das wohl mit pixelshadern gemacht sein, also kann es nur mit karten gehen die geforce 3, geforce 4 ti, und eventuell mit den ati grafikkarten über 8500 ( außer 9000 Pro ) gehen. Wenn es trotzdem funzt dann nur im software modus

Von MK42 am 18.02.2003, 19:23:58 Uhr
Also, nur mal so zur Erklärung:

Theorethisch kann man das auch auf einer GF1 und GF2 machen. Man benötigt hierfür jedoch mehrere Passes pro Lichtquelle. Das liegt an zwei Dingen:

1. Die Anzahl der Register Combiner mit denen man rechnen kann
2. Die Anzahl der Texturen, die man pro Pass verwenden kann

Mein Code ist so ausgelegt, dass er eine Lichtquelle in einem Pass machen will. Dies bedeutet, dass er 3-4 Texturen gleichzeitig braucht => nur GF3. Es kann sein, dass man die eigentlichen Rechenschritte, die mit den Texturwerten in den Register Combinern macht auch auf einer GF2 hinkriegt (GF1 glaube langt nicht) ... aber die Anzahl der Texturen ist der limitierende Faktor. Das Omni-Light braucht zum Beispiel eine Normalization Cubemap, eine Normalmap fürs Bumpmapping und die eigentliche Diffuse Textur.

Der Vertex Shader wird ja zur Not in Software emuliert.

Von den Fähigkeiten der Hardware sollte das locker auch auf ATIs laufen (8500 aufwärts). Ich bediene aber die Extensions nicht ... werde bald vielleicht eine Version mit ARB_vertex_program und ARB_fragment_shader haben, mal schauen. Will eh noch etwas ausprobieren und der Code könnte sich dafür eignen.

-Marco

Von SiC am 18.02.2003, 19:34:54 Uhr
wofür bitte verwendest du in deinem programm vertex shader?? Da bewegt sich doch nix außer den lichtquellen.

ich bekam beim starten ne meldung im fenster:
warning no shadow supported oder so ähnlich,
machste das mit shadowbuffering oder so, weil eigentlich sollte meine grafikkarte( G4Ti4200 ) das ja unterstützen, oder net?

Von MK42 am 18.02.2003, 22:03:26 Uhr
Naja, da bewegt sich zwar nix, aber es muss schon ein wenig rumgerechnet werden, damit die Register Combiner mit den richtigen Werten gefüttert werden. Auch müssen da Texturkoordinaten generiert werden (für die Projector-Lights), etc... kannst Dir ja mal die Programme anschauen ... sind im 'program'-Unterverzeichnis.

Zu dem Shadow-Krams ... der Code kann prinzipiell auch Shadow Volumes, aber nur wenn die Geometrie dafür geeignet ist. In meinem Fall muß sie 'geschlossen' sein. Das ist ein Standard Quake-Level aber nicht, da müßte man beim Laden noch ordentlich die Löcher in der Geometrie stopfen (z.B. Rückseiten von Wänden generieren, etc..) und dann hat man auch Schatten da drin. Die sind aber wirklich langsam. Da sollte man maximal drei bis vier gleichzeitig haben. Dann hat man (vom Specular mal abgesehen) einen (unoptimierten) Doom 3-Renderer ... ohne Specular-Lighting, was aber auch nicht so schwer ist.

-Marco

Von BertoSmasher am 19.02.2003, 22:23:22 Uhr
Jo SiC hab die gleiche graka und den gleichen fehler...
aber sonst siehts echt nett aus ;)

Von Oliver Düvel am 19.02.2003, 22:52:50 Uhr
Sieht wirklich cool aus. Habs bei mir ohne Probs zum laufen bekommen. Es war auch ziemlich schnell. Kann wirklich nur sagen, gute Arbeit Marco :)