Script Z-buffer Access ohne render...

schaf82

Grünschnabel
Ich habe gerade sowas wie einen line renderer geschrieben (eigentlich ist es sowas wie live trace). Ich gehe allerdings einen kleinen umweg bei der ganzen sache. ich render zuerst ein bild und zeichene dann von diesem bitmap die umrisse der einzelnen nodes nach.
wichtig bei der ganzen Sache ist, dasz das gezeichnete bild in einer ganz bestimmten possition im raum liegt (eingentlich eher auf einer x-beliebigen flaeche).


So ich hab so grundsaetzlich zwei fragen an euch:

1. kann ich auf den z-buffer von max-script auch zugreifen ohne das bild zu rendern ?
2. kenn vielleicht jemand eine anderen weg um ein komplexes object (komplexer umriss - z.B.: ein 3d-modell einer stadt) auf eine flaeche zu projezieren...

danke

ein schaf
 

cycovery

Erfahrenes Mitglied
hallo schaf! tönt interessant - wofür machst du das denn?

erstmal zu 2: einfach die vertices mit der entsprechenden projektionsmatrix multiplizieren. Wenn du ne Orthogonale projektion willst, ist das relativ simpel: nimm zwei vektoren v1 und v2 die die ebene, auf welche projeziert werden soll, aufspannen und bilde mit ihnen die Matrix A = (v1,v2)
die Projektionsmatrix kriegst du nun so: P = A * inverse((transponiert(A) * A)) * transponiert(A)

wählst du v1 und v2 orthonormal, ist die formel noch einfacher: P=A * transponiert(A)

zu1: da musst du vielleicht etwas genauer sein, wofür du das genau brauchst. Du kansnt die Z werte der vertices ja einfach berechnen und über die triangel linear interpolieren. Vielleicht ist es sogar möglich den bereich des z-buffers direkt per openGL bzw directX abzufragen bzw komplett ins mainmemory zu kopieren. Dürfte mit nur maxscript aber schwieriger werden. Was es allenfalls etwas einfacher machen könnte wäre die ganze scene mit einem HLSL depth shader zu belegen - dann hast du die tiefe immerhin im framebuffer der allenfalls etwas einfacher zugreifbar sein könnte...

Keine Ahnung, ob Dir das weiterhilft... sonst frag nochmal.


edit: ah sorry da hab ich zu wenig genau gelesen. Du renderst das bild ja sowieso mit dem raytracer. Ob du direkt nach dem rendern darauf zugreiffen kannst, weiss ich nicht - schon möglich. Was aber auf jedenfall gehen dürfte wäre einfach ein output format zu wählen, das den z-kanal speichert (z.b. rpf oder rla) und den dann aus dem file auslesen.
 
Zuletzt bearbeitet:

schaf82

Grünschnabel
das problem mit dem einfachen projezieren ist das ich dann die sichtbarkeit verliere!
ich studiere architectur und hab sowas wie einen renderer geschrieben der mir auf beliebige flaechen bereiche anzeigt wo direct sonnenlich hinkommt oder nicht (als vectorgraphik).
funktioniert auch ganz gut suche nur nach moeglichkeiten das alles noch schneller zu machen um es wirklich gebrauchstauglich zu machen. (momentan dauert es sowas um die 20 minuten um einen ganzen tag abzudecken).

gibts irgendwo opengl tutorials
 

cycovery

Erfahrenes Mitglied
openGL tutorials: such nach NeHe auf google

Wie meinst du die sichtbarkeit geht verloren? Meinst du dass alle polys auf einer ebene liegen und nichtmehr die richtige reihenfolge angezeigt wird? Ja - das dürfte mit dem raytracer schwieriger werden, da der ja effektiv die polygon intersections prüft. In realtime wäre das einfacher, da du ja immernoch die original tiefenwerte über die polygone interpolieren und auf pixelebebene z-testing durchführen kannst.

Am raytracer von max hab ich nie rummanipuliert - deshalb kan ich da nicht viel zu sagen - vielleicht gings ja sogar ganz einfach...
Ich würde das ganze wohl mit realtime shadern versuchen - aber kanns auch nicht genau sagen ob das möglich ist weil ich zu wenig weiss was und wie du das machst.
 

schaf82

Grünschnabel
Also...

Was ich tun will...
Ich habe ein 3d stadtmodell. Mich interressieren die flaechen die direktes Sonnenlicht bekommen und das ueber einen ganzen Tag.
ich benutz ein daylight system als camera und das ganze in einer ortogonalen projection.
dann render ich das bild (mit zbuffer und nodes).
dann laese ich die einzelnen flaechen aus und zeichne auf ihnen einen umriss der anzeigt wo die sonne scheint. (und das dann jede 30 minuten ueber einen ganzen tag)
damit laesst sich dann analysieren wo sonnige stellen in einer stadt sind.
wenn ich die geometrie auf die oberflaeche proeziere wird das ganze saukompliziert mit der ueberpruefung welche teile for welchen sind und dauert ewig (zumindestens soweit ich das behersche... ) desswegen auch der ganze umweg ueber den zbuffer und die nodes...

aber danke fuer die sache mit dem realtime shader und opengl...

maeh schaf