Rygir schreef op zaterdag 30 juli 2011 @ 18:24:
En heeft openGL daar ingebouwde voorzieningen voor want ik heb, in mijn Comp.Graph. opleiding wel een formule gezien (of de formule, weet niet of daar varianten op bestaan) en zou die prima kunnen implementeren maar dan moet ik per pixel die berekening doen (of mits de optimalisaties zoals interpolatie tussenvertices of tussen normalen) en ik weet niet hoe ik dat moet aanpakken. Ik werk momenteel met Qt en daar is alles zo netjes afgeschermd dat ik eigenlijk niet wat waar gebeurt, je hebt je paint functie en je zet daar wat 3D punten in om te tekenen en voila je krijgt een driehoekje of zo op 't scherm...maar buiten gouraud shading heb ik geen idee hoe ik binnen dat driehoekje iets anders dan een effen kleur krijg...
Ik weet niet of OpenGL een Fixed Function Pipeline heeft en of je die wel wilt gebruiken, maar als die er is (Google het eens), zal je met een regeltje of 20 (resources en states setten) wel een render pass kunnen maken. Daarmee kan je zonder shaders je model op het beeld krijgen. Dan moet je uiteraard wel weten hoe je een window maakt, OpenGL opstart en hoe je met de videokaart kan verbinden.
Maar als je zelf wilt bepalen hoe je objecten op licht reageren kun je beter aan shaders (.fx) beginnen. Ik weet weer niet hoe OpenGL dat doet (of beter: hoe OpenGL met GLSL praat), maar je zult twee functies moeten maken:
- Eentje die elke vertexpositie van relatief-aan-nulpunt-object (Object Space) naar pixelcoordinaten converteert (Clip Space e.d.). Noemt men een Vertex Shader.
- En eentje die elke resulterende pixel die niet achter andere pixels zit een kleur geven. Di's een Pixel Shader.
En uhm, dat normalen zelf maken is echt pestwerk. Ben zelf ook jaartje geleden met een 3D-prog begonnen, en zat toen met hetzelfde probleem: "waar haal ik de modellen vandaan?". Heb dus tijdje later een .obj-lezer gemaakt (kun je vast nog ergens vinden op m'n GoT-profiel): dan hoef je alleen nog maar voor een (gratis) editor te zorgen: Wings3D of Blender ofzo.
Dat heb ik tot nu toe gewoon aangepakt door zelf mijn kubus punten te berekenen in een eigen-gemaakt cube object. Feitelijk gewoon eenmaal een rib lengte opgeven en daarna met een 2e parameter bepalen hoeveel je afsnijd van elke rib om af te schuinen. Handwerk, maar puntjes berekenen is leuk

.
Probeer daar is een theepot mee te maken.

Dat was ik dus ook aan't denken... moet ik dat dan op voorhand renderen naar textures? Of kan ik dat realtime klaarkrijgen, die schaduwen? En in geval van op voorhand... tips voor hoe je zo iets moet aanpakken? Gaat mijn petje momenteel te boven om naar iets anders dan het scherm te renderen. @randen : normals interpoleren... idd leuk gedacht.
Ik weet niet hoe ze die schaduwen gedaan hebben, maar gelukkig lijkt het geen SSAO (dan zou er op veel meer plekken schaduw te zien moeten zijn, zoals de onderkant van de doosjes). Grote kans dat het gewoon ambient maps zijn.
Oei... moeilijk woord... deferred? Zie niet in wat afleiden of uitstellen te maken heeft met AA...kennelijk nog iets wat ik moet gaan opzoeken...
De 'normale' manier van alle objecten naar kleurenpixels converteren gaat zo (noemen ze Forward Rendering):
- Per object elke vertex een pixelcoordinaat (x,y,diepte) geven. (Vertex Shader)
- Bepalen welke pixels het model inneemt (interpolate).
- Over elke pixel die niet achter een bestaande pixel ligt de Pixel Shader (kleur geven) gooien.
- En tot hier dus per object.
Dat kan helaas erg zwaar zijn als er bijvoorbeeld veel lichten nodig zijn, want de 'zwaarheid' van een level is dan grofweg zo te berekenen:
aantalmodellen*aantallichten
Niet altijd handig, want modellen die achteraf ergens achter blijken te staan hebben wel tijd gekost om een kleur te geven (met een licht). dus daarom is er Deferred Rendering. Dat gaat zo:
- Van alle objecten elke vertex een pixelcoordinaat (x,y,diepte) geven. (Vertex Shader)
- Bepalen welke pixels er bovenaan zitten (in het zicht).
- Nu staan alle objecten op het scherm (wel zonder kleur).
- Over elke overgebleven pixel die niet achter een bestaande pixel ligt de Pixel Shader gooien.
Hiermee hoef je maximaal bijv. 1920x1080 maal de pixel shader uit te voeren.
Klinkt interessant die ambient occlusion blob.
Shame on me voor het niet kennen van die term, maar uh, is dat gewoon een sphere die je elke pixel op intersect test en if(intersect) dan de pixel donkerder maakt?
En zoals ik al vreesde, shaders dus... een tip waar ik goeie "tutorials" of beginners hulp met shaders kan vinden? Als ik de lighting oversla valt er misschien nog wel wat interessants te maken op de beschikbare tijd.
Jep, eerst is een model op zijn plek krijgen en gewoon de kleur op 1,1,1 zetten (outPS.color.rgba = float4(1,1,1,1);)..
Heb snel over
SSAO gelezen, maar kan niet eens goed opmaken wat het doet. Berekent het, uit alle richtingen, hoe veel iets "omsloten" is? Dus alsof er licht van overal komt (ambient licht dus) en alle richtingen even belangrijk zijn?
Ik ben er maanden mee bezig geweest en heb het tweemaal opgegeven, maar nu werkt het eindelijk. Kijk, ehm, in geval van een werkende Deferred Renderer is het niet lastig, maar het doet eigenlijk dit:
- Sla van elke pixel de diepte op.
- Kijk bij elke pixel bij een random paar omliggende pixels of die buren toevallig niet minder diepte hebben (dus schuin ervoor zitten). Als er van dit soort pixels gevonden zijn, maak de pixel die getest wordt donkerder.
Ik zou er voorlopig nog niet aan beginnen, maar het ziet er zo uit (effect is even overdreven gemaakt):

Ziedaar mijn creatie waar ik een jaar geleden met hetzelfde idee aan begon!
Dit doe je trouwens ook met Rendering 'passes'. Twee stuks in dit geval.
En radiosity werkt toch op basis van raytracing dacht ik he? Lijkt me in ieder geval overkill. Lightmaps lijken mij ook de meest logische aanpak maar de theorie omzetten in praktijk middels openGL weet ik dus nog niet waar te beginnen.
Raytracing moet je niet aan beginnen nee.
Waar te beginnen he? Zat ik ook mee. Nou, in ieder geval, wat je eerst is moet doen is een Win32-window (HWND noemen ze dat) maken en OpenGL opstarten en met de videokaart verbinden.
Oh, enne, ik heb nog nooit van m'n leven iets aan wikipedia gehad als het over dit soort onderwerpen gaat. Goeie sites zijn bijvoorbeeld
gamedev.net en msdn als je voor D3D gaat.
Over D3D vs OpenGL (héél simpel gezegd): D3D heeft de betere documentatie, maar draait uiteraard alleen op Windows en Wine.
Oh, en uh, zoek is een leuk boek op. Veel nuttiger dan internet.
Ik wilde nog wel meer typen, maar het is helaas even etenstijd enzo.
Edit: sorry voor het haastige getyp, maar ik kon het niet laten om te reageren op vragen over m'n favo onderwerp: 3D.