2012-06-20 15 views
5

Ich habe eine Anwendung entwickelt, die einen prozeduralen Himmel rendern muss, was ich damit meine, dass der Himmel einen Tag-Nacht-Zyklus hat, der sich je nachdem ändert, wie spät es ist innerhalb der Simulation.Prozedurale/Dynamische Färbung einer Skybox in OpenGL

ich eine Methode irgendwo in der Vergangenheit gesehen habe, wo sie einen colormap sush wie diese: enter image description hereenter image description here

nun auf etwas variabel in Abhängigkeit, wie Zeit, irgendwie den Code-Scans über das Bild und Verwendungen eine Reihe von Farben für die Textur des Himmels. Auch während sunrise/sunset wird der Code zu einer gelben, orange, roten Farbe wie auf der rechten Seite scannen.

Ich bin mir nicht sicher, was das heißt, aber ich denke, dass es das ist, wonach ich bin. Ich würde mich freuen, wenn mir jemand zeigen oder auf ein Beispiel der Verwendung dieser Technik mit OpenGL und C++ hinweisen würde.

Auf einer Seite beachten Sie meine Skybox nicht Ihre durchschnittliche Form ist sein eher ein Himmel-rechtwinkligen wie unten enter image description here

Wie man dort sehen kann keine oben zum Himmel -right-angle Es sind nur die zwei blauen Seiten, die Sie sehen, die den Himmel gerendert haben (Schwarz ist die BG). Ich fragte mich, ob es irgendeinen Weg geben würde, einen prozeduralen/dynamischen Nachthimmel auf diesen beiden Ebenen zu schaffen (ohne dass die Naht zwischen ihnen auch auffällt) und als eine Nebenfrage haben sie es auch so, dass die Spitze der Ebenen verblasst egal es seine Nacht oder Tage

Jede Erklärung/example auf alpha, wie ein colormap zu scannen dann als Textur legen sie es in OpenGL/C++ wird sehr geschätzt.

+2

Zu dem, der für nahe stimmte: Das ist eigentlich eine interessante Frage und weder off-topic noch unklar. Es ist nur ein schwieriges Thema.Leider muss ich jetzt einen Vortrag vorbereiten, sonst würde ich die Erklärung der mehrschichtigen Himmelgradientenzusammensetzung (für die diese Textur verwendet wird) erklären. – datenwolf

+1

@datenwolf Vielleicht könntest du in ein paar Tagen wieder zu diesem Thema kommen. Ich bin sicher, es gibt andere wie mich, die eine gut ausgebildete Antwort schätzen würden. – s3rius

Antwort

1

das letzte Projekt Download ( Spezialeffekte) in dieser URL http://golabistudio.com/siamak/portfolio.html
Die C++ Quelle ist nicht verfügbar, aber die Shader-Quelle vorhanden ist.
Sie müssen 2 Texturen an Ihren Shader übergeben (beim Rendern der Ebene). Die erste Textur ist Ihre Standard-Skybox-Textur. Die zweite Textur ist Ihre Tag/Nacht-Zyklustextur. Am einfachsten kann es eine breite Farbverlauf Textur der Höhe 1 sein, von blau bis dunkel. Mit dieser zweiten Textur, die an Ihren Shader übergeben wird, können Sie an der Position x = time ein Pixel aufnehmen und die Farbe zu Ihrer diffusen Textur hinzufügen (die erste Textur).

Der nächste Schritt ist der Sonnenaufgang. Wieder auf es am einfachsten ist, dies zu tun, müssen Sie den Sonnenaufgang Pixel horizontal und die andere in der Nacht Steigung eine Textur mit einer Breite von 2 mit einer Seite erstellen: (vergrößerte Breite) http://i.imgur.com/Rl8XJ.png

Jetzt mit eingehender uv für die Koordinate diffuse Textur (die erste Skybox Textur) nehmen Sie die folgenden

float2 uvpos; 
    uvpos.y = IN.uv.y;//the position same as skybox texture 
    uvpos.x = 0;//a sample from first horizontal pixel 
    float4 colour1 = tex2D(gradientTexture, uvpos); 
    uvpos.x = 0.5;//a sample from second horizontal pixel 
    float4 colour2 = tex2D(gradientTexture, uvpos); 

    float4 skycolor = lerp(colour1 , colour2, (your day time)); 
    skycolor.xyz += tex2D(skyTexture, IN.uv).xyz; 

Es ist sehr einfache Implementierung, aber sollte Sie gehen, denke ich.