DGL
https://delphigl.com/forum/

glClearColor im Fragment Shader
https://delphigl.com/forum/viewtopic.php?f=20&t=10151
Seite 1 von 1

Autor:  AMD [ Mi Nov 09, 2011 12:27 ]
Betreff des Beitrags:  glClearColor im Fragment Shader

Hey,

Ich habe mit glClearColor einen hellblauen Hintergrund bei mir erstellt doch das ist mir leider etwas zu eintönig. Könnte man dies mit einem Fragment Shader (daher im Shader-Bereich) ändern und so z.B. mehrere Bereiche zuordnen? Also das es auf Z = 0 höhe eine eher helle Farbe hat und nach oben steigend es dunkler wird?!

Falls sich das nicht über einen Shader machen lässt sondern anders dann kann das Thema gerne verschoben werden ^^

Edit// Eine Skybox bzw. Skysphere würde ich gerne vermeiden.

Autor:  damadmax [ Mi Nov 09, 2011 12:43 ]
Betreff des Beitrags:  Re: glClearColor im Fragment Shader

Soweit ich weiss kommt der Fragment Shader nur zum Zuge wenn man ein Stück Geometrie rendert.

Autor:  AMD [ Mi Nov 09, 2011 14:33 ]
Betreff des Beitrags:  Re: glClearColor im Fragment Shader

Hm stimmt eigentlich.
Also ist der Shaderbereich schonmal falsch...

Kann man das dann noch anders lösen - außer mit einer skysphere/box?

Autor:  mrtrain [ Mi Nov 09, 2011 14:41 ]
Betreff des Beitrags:  Re: glClearColor im Fragment Shader

Schonmal an Nebel gedacht?

Autor:  Skeptiker [ Mi Nov 09, 2011 15:40 ]
Betreff des Beitrags:  Re: glClearColor im Fragment Shader

Warum wechselst du nicht einfach kurz in den Ortho Modus, zeichnest ein Fullscreen Quad mit deinem Shader und dann wieder zurück in den Perspektivischen, dass dürfte wohl mit die schnellste Möglichkeit sein, Beispiel:

Code:
  1. glMatrixMode(GL_PROJECTION);
  2. glLoadIdentity();
  3. glMatrixMode(GL_MODELVIEW);
  4. glLoadIdentity();
  5.  
  6. // Binde deinen Fragment Shader
  7.  
  8. // Zeichne ein Quad mit (0.0 - 1.0 auf x und 0.0 - 1.0 auf y)
  9.  
  10. glMatrixMode(GL_PROJECTION);
  11. gluPerspective(...);
  12.  
  13. // deine normale Szene zeichnen


Eventuell musst du verhindern das in den Depth Buffer geschrieben wird (während des Zeichnens des Fullscreen Quads), evtl. nutzt du auch OpenGL >= 3.0, dann musst du die Matrizen natürlich an deine Shader geben und nicht über die OpenGL Funktionen setzen.

Dann hast du deinen Framebuffer mit einer beliebigen Farbe, Farbverlauf oder alles andere was über einen Fragment Shader vorstellbar ist gefüllt und kannst darauf deine Szene wie gewohnt zeichnen.

Viele Grüße!

Autor:  AMD [ Mi Nov 09, 2011 16:33 ]
Betreff des Beitrags:  Re: glClearColor im Fragment Shader

@mrtrain: Klar, aber der normale glFog ist teilweise doch etwas eingeschrenkt in den Einstellungsmöglichkeiten!

@Skeptiker: Jop die Idee find ich gut! Werds probieren, danke für den Tipp :)

Autor:  SDH.Prod [ Mi Nov 09, 2011 22:00 ]
Betreff des Beitrags:  Re: glClearColor im Fragment Shader

Oh hoffentlich werde ich nicht wieder verhauen. :D


Das wechseln in den orthogonalen Modus ist eine Sache, hat aber zwei Nachteile:
1. Dauert es Zeit diese Matrix zu erstellen und in die Grafikkarte zu laden.
2. Diese Funktion ist ebenfalls "deprecated" oder wie das heißt, also veraltet --> wird eventuell später in zukünftigen Grafikkarten nicht mehr verfügbar sein.

Alternativ kannst du einfach an der Stelle im Shader 4 x-beliebige Vertex-Koordinaten übergeben und die im VertexShader auf
(-1, 1, z, 1)
(-1,-1, z, 1)
( 1,-1, z, 1)
( 1, 1, z, 1)
setzen (in der Reihenfolge) und diese an den Rasterizer / Fragment Shader schicken und hast denselben Effekt.

Einzigstes Problem: du musst eventuell einen Extra-Shader laden. :/

2. Alternative: die wählst beliebige Koordinaten die extrem hoch und breit sind und nur eine niedrige z-Distanz zur Kamera haben (wird ein weniger schwieriger wenn die Kamera rotiert ist.

Autor:  Skeptiker [ Do Nov 10, 2011 09:55 ]
Betreff des Beitrags:  Re: glClearColor im Fragment Shader

Also Probleme wegen deprecated hab ich ja schon angesprochen, die sind aber faktisch nicht vorhanden, denn du musst in OpenGL >= 3.0 deinem Vertex Shader sowieso die Matrizen (die Matrix) übergeben, um einen "Orthogonalen Modus" zu haben brauchst du als Projektion und Modelview nur eine Identitätsmatrix, und kannst dann ein Fullscreen Quad Zeichnen indem deine Vertizes die Koordinaten 1,1,0; -1,1,0; -1,-1,0; 1,-1,0 haben, also X und Y von -1 bis 1 haben.

Deine Perspektivische Matrix hast du demnach sowieso noch im Speicher und übergibst sie danach einfach wieder an deinen Shader für den Rest der Szene.

Du kannst das Fullscreen Quad auch im perspektivischen Modus zeichnen, dafür musst du nur die Breite/Höhe des Frustums an einer beliebigen Z-Position errechnen, dass geht folgendermaßen:
Code:
  1.     public float getWidthAt(float z) {
  2.        
  3.         return (float) Math.tan(getFovy() * Math.PI / 360) * 2 * -z * getAspect();
  4.     }
  5.    
  6.     public float getHeightAt(float z) {
  7.        
  8.         return (float) Math.tan(getFovy() * Math.PI / 360) * 2 * -z;
  9.     }


Und dann nurnoch das Quad an dieser Z-Position mit der erhaltenen Breite und Höhe zeichnen. Dafür musst du dann aber definitiv das schreiben in den Z-Puffer verhindern.

Ich empfehle aber die Methode mit den Identitätsmatrizen, die ist genauso schnell, vllt. sogar schneller als im Perspektivischen Modus zu bleiben, und neue Shader brauchst du auch nicht binden sofern dein aktueller nichts weiter macht als Projektions/ModelView Matrix mit den Vertizes zu multiplizieren und entsprechend zu texturieren.

Viele Grüße!

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/