Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 11:07

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glClearColor im Fragment Shader
BeitragVerfasst: Mi Nov 09, 2011 12:27 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glClearColor im Fragment Shader
BeitragVerfasst: Mi Nov 09, 2011 12:43 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Soweit ich weiss kommt der Fragment Shader nur zum Zuge wenn man ein Stück Geometrie rendert.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glClearColor im Fragment Shader
BeitragVerfasst: Mi Nov 09, 2011 14:33 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Hm stimmt eigentlich.
Also ist der Shaderbereich schonmal falsch...

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glClearColor im Fragment Shader
BeitragVerfasst: Mi Nov 09, 2011 14:41 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Schonmal an Nebel gedacht?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glClearColor im Fragment Shader
BeitragVerfasst: Mi Nov 09, 2011 15:40 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
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!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glClearColor im Fragment Shader
BeitragVerfasst: Mi Nov 09, 2011 16:33 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
@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 :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glClearColor im Fragment Shader
BeitragVerfasst: Mi Nov 09, 2011 22:00 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glClearColor im Fragment Shader
BeitragVerfasst: Do Nov 10, 2011 09:55 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
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!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.023s | 17 Queries | GZIP : On ]