Registriert: Mo Okt 15, 2007 18:30 Beiträge: 74 Wohnort: Berlin
Zitat:
Warum genau musst du den Geometrieausschnitt kennen der innerhalb des Viewing-Frustum liegt? Pixel außerhalb des Viewing-Frustum werden von der Grafikkarte sowieso nicht gerendert. Die Geometrie wird im "Clipping"-Schritt vorher passend zurecht geschnitten. Das macht aber auch die feste Funktionspipeline so
Habe mich vielleicht etwas unglücklich ausgedrückt. Ich meine nicht das Viewing Volume welches auf dem Bildschirm ausgegeben wird. Erdbeobachtende Satelliten haben ja ebenfalls Kameras an Bord, und deren Sichtfeld kann ja gewissermaßen auch durch ein Frustum beschrieben werden. Stell dir vor diese Pyramide schneidet die Erdoberfläche, dann begrenzen die Schnittlinien die von der Kamera eingefangene Oberfläche. Und dieses Oberflächenstück möchte ich nun in eine Textur zeichnen. Mit zunehmenden Erdumläufen wird auch mehr Oberfläche aufgenommen, und den Bereich möchte ich darstellen bzw. in eine 2D-Textur rendern.
Ohne das Thema jetzt in diesem Thread zu sehr zu vertiefen, seht ihr da Potential für Shader?
Und dieses Oberflächenstück möchte ich nun in eine Textur zeichnen.
Also du willst genau das was die Kamera sieht in der Textur haben? Du kannst statt auf den Bildschirm auch in ein FramebufferObject (FBO) rendern? Mit Shadern hat das nichts zu tun.
Ich vermute aber das ich immer noch nicht verstanden habe was du willst. Willst du vielleicht in der Planetentextur (die um den Planeten gewickelt ist) sehen welche Texel der Textur sichtbar waren? In dem Fall ist das tatsächlich ein klarer Fall für den Shader. Das vorgehen wäre in etwa so:
Rendern eines 2D-Quads das die Planetentextur überdeckt, einfach nur um den Fragmentshader für jeden Texel der Textur auszuführen. Im Fragmentshader hast du Zugriff auf die Texturkoordinaten. Du weißt also welcher Texel gerade gerendert wird. Da du (hoffentlich) auch weißt wie die Textur um den Planeten gewickelt wurde kannst du aus den Texturkoordinaten die 3D-Position im Raum berechnen. Also z.B. ist x der Winkel und y die Höhe, dann wäre das irgendwie so etwas:
Code:
vec3 position = vec3(sin(x), 2.0*y-1.0, cos(x)) * radiusDesPlaneten;
Die 3D-Position multiplizierst du mit der ModelViewProjection-Matrix die du zum rendern des Planeten verwendest.
projected /= projected.w; // nach einer Projektionsmatrix muss man durch w teilen
Nun musst du nur noch für X,Y und Z prüfen ob sich der Punkt im Einheitswürfel (von -1 bis 1) befindet. Wenn ja ist der Punkt sichtbar, wenn nicht dann nicht. Das geht z.B. so:
Code:
if (all(lessThanEqual(abs(projected.xyz), vec3(1,1,1) ))) {
Registriert: Mo Okt 15, 2007 18:30 Beiträge: 74 Wohnort: Berlin
@Flash: Die Möglichkeit habe ich auch schon in Betracht gezogen, allerdings will ich die Räumliche Tiefe gar nicht. Alles soll auf 'Meeresspiegel' liegen. Ziel ist es gewissermaßen die Coverage des bereits fotografierten Bereichs darzustellen. Wenn also der Nordamerikanische Raum abgedeckt wurde, sollen diese Texel auch andersfarbig erscheinen. Bei dem Multi-Kugel-Prinzip mit leicht unterschiedlichen Radien hätte ich aber auch Parallaxefehler drin (wenn man aus einem anderen Winkel draufschaut).
@Coolcat:
Zitat:
Willst du vielleicht in der Planetentextur (die um den Planeten gewickelt ist) sehen welche Texel der Textur sichtbar waren?
Genau! Und ich will in einer deckungsgleichen Textur eben diese Texel einfärben. Die neue Textur kann dann auf Wunsch darüber gelegt und verblendet werden.
Bei dem Multi-Kugel-Prinzip mit leicht unterschiedlichen Radien hätte ich aber auch Parallaxefehler drin
Was spricht dagegen identische Kugeln zu benutzen? Solange die Kugeln wirklich identisch sind und auf identische Art (*) gerendert werden gibt das auch keine Probleme mit dem Z-Buffer. Wenn der Z-Buffer zum Problem wird kann man glDepthRange benutzen.
(*) wirklich identisch, eine andere eigentlich äquivalente Reihenfolge von Operationen kann bereits kleine Rundungsfehler verursachen.
Zitat:
Genau!
Ja, dann geht das mit Shadern....die 5 Zeilen von mir da oben sind schon alles.
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.