- varying vec4 vpos;
- void main(void)
- {
- vpos = gl_Vertex;
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_FrontColor = gl_Color;
- }
DGL https://delphigl.com/forum/ |
|
Ersetzen Shader immer die Fixed Pipeline? https://delphigl.com/forum/viewtopic.php?f=20&t=7471 |
Seite 1 von 1 |
Autor: | Rüdiger [ Fr Mai 02, 2008 12:18 ] |
Betreff des Beitrags: | Ersetzen Shader immer die Fixed Pipeline? |
Hey Leute! Also ich bin völlig neu in der Shaderprogrammierung, also seid gnädig mit mir :) Gibt es eine Möglichkeit, Shader einzusetzen, ohne damit die bisherige Pipeline zu ersetzen? Ich meine, wenn ich Shader einsetzen wollte, dann muss ich doch alles unglaublich viel nachbauen, um Blending, Alphatest, Multitexturing etc. wieder zu bekommen, oder hab ich das falsch verstanden? Wie macht ihr sowas? Bitte dran denken, dass das Gebiet für mich ziemlich neu ist ;) Viele Grüße, Rüdiger |
Autor: | Lord Horazont [ Fr Mai 02, 2008 12:25 ] |
Betreff des Beitrags: | |
Leider bleibt viel von der Pipeline erhalten. Der Vertexshader setzt da an, wo die Vertices transformiert werden, also die ganzen Matrixoperationen sind ausgeschaltet, aber die haste mit zwei zeilen nachgebaut. Der Fragmentshader setzt da an, wo ein Fragment (Pixel) seine Farbe bekommt. Das heißt, vor dem Blending und vor dem Alphatest, er ersetzt die Texturierung. Du musst also die Texturen dann selber zusammenrechnen (wenn du Multitexturing hast) oder eben nur auslesen und draufpappen. In den Shadern hast du mehrere Dinge zur verfügung, wie z.B. den vom Programm übergebenen Vertex oder die Texturkoordinaten, sowie alle Lichtkonstanten und noch viel mehr. Für dich als Shadereinsteiger ist Tutorial glsl im Wiki als Nachschlagewerk und Einstieg auf jeden fall zu empfehlen. Später schauste dir dann auch noch Tutorial glsl2 an. Gruß Lord Horazont |
Autor: | Rüdiger [ Fr Mai 02, 2008 12:40 ] |
Betreff des Beitrags: | |
Bekomm ich denn irgendwo Shader-Code her, der Blending/Alphatest, Multitexturing, OGL-Nebel im Shader stehen hat? Es ist irgendwie blöd, sich die Standard-OpenGL-Fkt. neu bauen zu müssen ![]() |
Autor: | Lord Horazont [ Fr Mai 02, 2008 14:07 ] |
Betreff des Beitrags: | |
Wie gesagt, Blending und Alphatest bleiben erhalten. Der Nebel soweit ich weiss auch. vertexshader: Code:
fragmentshader: Code:
Das wäre zum beispiel ein einfacher Shader, der nichts weiter tut als die Fragmente ganz normal zu texturieren (mit genau einer textur). Gruß Lord Horazont |
Autor: | Rüdiger [ Fr Mai 02, 2008 15:11 ] |
Betreff des Beitrags: | |
Okay, langsam durchblicke ich es ![]() Code:
hat leider keine Auswirkung mehr. Aber ich werde mal ein bisschen probieren! |
Autor: | Lord Horazont [ Fr Mai 02, 2008 17:25 ] |
Betreff des Beitrags: | |
Um die Texturmatrix zu nutzen, musst du die Koordinaten der Textur vorher noch mit der Matrix multiplizieren: vertexshader: Code:
fragmentshader Code:
So sollte das klappen. Hast du die Textur auch als Uniform gesetzt (mit glUniform1i und glGetUniformLocation) oder hast du gerade einfach nur glück? Gruß Lord Horazont |
Autor: | Rüdiger [ Fr Mai 02, 2008 19:31 ] |
Betreff des Beitrags: | |
Ja, ich benutze Multi-Texturing, und muss dafür an die Uniform-Variable ja mit glUniformi() für die Textur ja die TMU übergeben. Klappt leider nicht so ganz. VertexShader: Code:
FragmentShader: Code:
Jetzt übergebe ich ja die Textureinheitsangaben für tex0 und tex1 mit Code:
Ist doch richtig so, oder? Damit mein Shader weiß, welche Textureinheit jetzt Texturkoordinaten bekommt. Leider funktioniert das nicht. Ich bekomme zwar zwei Texturen mit den richtigen Texturkoordinaten, aber: 1. Die Textur wird trotz des Befehls glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); nicht "gewrappt". Man sieht sie nur in einer Ecke... 2. Meine zweite Textur ist normalerweise eine Detailtextur. Hier wird jedoch wieder die Textur von der ersten Schicht draufgepackt. Woran könnte es liegen? Übrigens danke Lord Horazont für den Code. Das hilft ungemein! Viele Grüße, Rüdiger |
Autor: | oc2k1 [ Fr Mai 02, 2008 19:50 ] |
Betreff des Beitrags: | |
Am shader code gibt es einige dinge zu verbesser: Die Texturmatrixmultiplakationen umbeding im Vertexshader ausführen, da diese den shader sonst um einiges langsamer machen. Möglicher weise macht es mehr sinn beide texturen zu addieren anstat sie zu multiplizieren, jedoch ist dies vom inhalt der detailtextur abhängig. Bei glUniform1i(glGetUniformLocation(ProgramObject,"tex1"), 1); muss man darauf auchten, das das program auch aktiv ist, da sich glUniform1i(...) auf das aktive programm und nicht auf da was als argument von "ProgramObject" übergeben wurde. (Das war wohl ein unvollkommener verzuch zwanghaft am prinzip der statemaschine festzuhalten.) |
Autor: | Lord Horazont [ Fr Mai 02, 2008 20:12 ] |
Betreff des Beitrags: | |
@Rüdiger: Was ist tex1 bei deinem glGetUniformLocation Aufruf für eine Variable? Du musst da einen String übergeben, der den Namen der Uniformvariable enthält, z.B. Code:
Denn wenn du bei beiden Samplern die gleiche Textur bekommst, ist das ein sehr sicheres Zeichen dafür, dass bei der Uniform-Location was nicht stimmt. Gruß Lord Horazont |
Autor: | Rüdiger [ Sa Mai 03, 2008 11:08 ] |
Betreff des Beitrags: | |
Danke euch beiden! Es lag tatsächlich beim Übergeben der Uniform-Variable... Ich dachte, PChar würde durch einen Pointer auf String ersetzt werden können. Ich muss sagen, trotz dieser Schwierigkeiten machts schon Spaß :) Ich hab im VertexShader spaßeshalber mal die noise-Funktion addiert - lustige Effekte durch nur einen Befehl! Viele Grüße, Rüdiger |
Autor: | Lord Horazont [ Sa Mai 03, 2008 12:12 ] |
Betreff des Beitrags: | |
Rüdiger hat geschrieben: Ich dachte, PChar würde durch einen Pointer auf String ersetzt werden können.
Das geht, aber dafür musst du entweder auf das erste Zeichen zeigen (mit @tex0[1]) oder in Delphi auf PChar casten (mit PChar(tex0)). Gruß Lord Horazont |
Autor: | Rüdiger [ Sa Mai 03, 2008 13:13 ] |
Betreff des Beitrags: | |
Gut, ich habs jetzt einfach mit PChar als Übergabetyp geregelt. Ich steh nun wieder vor einem neuen Problem: Meine Shader: Vertexshader: Code:
Fragmentshader: Code:
Die beiden funktionieren so auch schon ganz gut. Ich habe Multitexturing ja aktiv - doch wenn ich jetzt mein Gras rendere, das nur eine Textur hat und mithilfe des Alphatests geblendet wird, dann geschieht das nicht. Das Gras bleibt einfach unsichtbar. Meine anderen Flächen sind normal sichtbar. Wenn ich die Shader so weit abändere, dass die zweite Texturstufe nicht benutzt wird, dann funktioniert es wieder. Hat jemand eine Ahnung? Achja, ganz wichtig: Kann ich Shader auch abschalten, also z.B. nur für einen Teil meiner Szene benutzen? Das muss doch gehen, oder? Quasi das Pendant zu glUseProgram. Viele Grüße, Rüdiger |
Autor: | Lord Horazont [ Sa Mai 03, 2008 14:11 ] |
Betreff des Beitrags: | |
glUseProgram mit Parameter 0 sollte funktionieren. Das Problem liegt glaube ich darin, dass du als Alpha-Wert bei einer nicht existenten Textur von texture2D ein 0 bekommst. was passiert bei der multiplikation mit 0? es kommt 0 raus, d.h. dein Alphatest blendet dir die fragmente raus (ich hoffe, ich irre mich da jetz nicht). Als lösung könntest du eine weiße Textur mit vollem Alpha verwenden und in die zweite Textureinheit schieben. Gruß Lord Horazont |
Autor: | WhiteHunter [ Sa Mai 03, 2008 14:20 ] |
Betreff des Beitrags: | |
Im Grunde ist ja das schöne am Shader ja, dass du den Alphawert beliebig aus jeder Quelle berechnen kannst. In deinem Fall könntest du zB. nur den Alphawert aus der ersten Textur nehmen, oder zB. den Roten Kanal deiner 2. Textur als Alphawert benutzen. Oder ihn einfach immer auf einen festen Wert, zB. 1.0 setzen. Im Übrigen kannst du einen Alphatest auch direkt in den Shader integrieren - das Schlüsselwort "discard;" verhindert, dass das Fragment (= Pixel) gezeichnet wird. Allerdings ist bei SM2-Karten Vorsicht geboten, da die alle darauf folgenden Befehle noch ausführen, aber dann verwerfen. MfG |
Autor: | Rüdiger [ Mo Mai 05, 2008 13:51 ] |
Betreff des Beitrags: | |
Okay, vielen Dank für Eure Infos! Viele Grüße, Rüdiger |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |