DGL https://delphigl.com/forum/ |
|
Wieso funktioniert dies ? https://delphigl.com/forum/viewtopic.php?f=20&t=11045 |
Seite 1 von 3 |
Autor: | mathias [ Fr Dez 13, 2013 18:49 ] |
Betreff des Beitrags: | Wieso funktioniert dies ? |
Wieso kann dieser VertexShader überhaupt funktionieren. Anstelle von inColor und inPos, habe ich Fantasienamen geschrieben. Wie kann OpenGL überhaupt wissen was ich mit diesen Namen meine. Der Namen xxxin... ist im Delphi-Quellcode auch nirgends erwähnt. Die Variable Color kann ich auch einen anderen Namen geben, nur muss sie im Fragment und im VertexShader gleich heissen. Diese Variable ist wohl die Verbindung zwischen den beiden Shadern. Code:
|
Autor: | glAwesome [ Fr Dez 13, 2013 19:25 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Mit welchen Werten die in-Variablen eines Vertexshaders belegt werden sollen, legst du beim Aufruf von glVertexAttribPointer fest. Tust du dies nicht, sind die Werte undefiniert, würde ich sagen. mathias hat geschrieben: Die Variable Color kann ich auch einen anderen Namen geben, nur muss sie im Fragment und im VertexShader gleich heissen. Diese Variable ist wohl die Verbindung zwischen den beiden Shadern. Korrekt. Zu jeder in-Variable im Fragmentshader muss es eine gleichnamige out-Variable im Vertexshader geben. Früher hieß das nicht in und out, sondern varying.
|
Autor: | mathias [ Fr Dez 13, 2013 20:00 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Hier steht nirgends was von xxxinColor oder inColor. Code:
|
Autor: | glAwesome [ Fr Dez 13, 2013 20:09 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Du rufst zwei Mal glVertexAttribPointer auf und zwar mit 0 und 1 als erstes Argument. "Zufällig" sind das offenbar die Nummern, die dein Grafiktreiber für deine in-Variablen vergeben hat. Darauf kannst du dich nicht verlassen. Korrekterweise müsstest du diese IDs erst mit glGetAttribLocation abfragen (nach dem Linken) oder vor dem Linken mit glBindAttribLocation festlegen. Edit: Eine weitere Möglichkeit ist es, die IDs der VS-Inputs mit dem keyword layout festzulegen. Beispiel: Code:
|
Autor: | mathias [ Fr Dez 13, 2013 21:39 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Ich habe ein Tutorial dazu gefunden, dank deiner Befehle. Ich hoffe das es jetzt so richtig ist. Wen ich jetzt die xxx reinschreibe, bleibt das OpenGL-Fenster leer. Ich habe die Werte von Pos_id und col_id abgefragt und da kommt -1, wen ich die xxx reinschreibe und das ist richtig so. Somit ist wieder eine Fehlerquelle ausgeschlossen. ![]() In dem Tutorials, es waren 2, nach denen ich mein Programm geschrieben habe, finde ich nichts von glGetAttribLocation. Bei den ids kommen 0 und 1 raus und dies wird wohl der Programmierer des Tutorials ausgenutzt haben Code:
|
Autor: | mathias [ So Dez 15, 2013 17:32 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Ich habe noch was komisches in meinem Quelltext gefunden. Wen ich es richtig verstehe, ist outColor auch undefiniert. In verschiedenen Tutorials über Licht habe ich gelesen, das man gl_FragColor nehmen kann. Auch diese Zeilen sind verschieden. alt: in vec4 Color; neu: varying vec4 Color; Code:
Code:
|
Autor: | glAwesome [ So Dez 15, 2013 17:40 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
gl_FragColor und varying sind deprecated. Bei deren Benutzung in #version 330 wird der Compiler mindestens eine Warnung ausspucken. Aktuell sind in und out. outColor kannst du allerdings benennen, wie du willst. Da es die einzige out-Variable im Fragmentshader ist, weiß der Compiler, dass die Farbe gemeint ist. Man kann auch mehr als nur eine Farbe im Fragmentshader ausgeben. Wie man dem Treiber dann sagt, welche Variable was sein soll, wüsste ich auch gerne. Vielleicht weiß das ja jemand hier. |
Autor: | OpenglerF [ So Dez 15, 2013 17:48 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Zitat: alt: in vec4 Color; neu: varying vec4 Color; Nein, genau andersrum. Wenn im Fragmentshader in mehrere Colorbuffer gerendert wird, muss man, glaube ich, einfach ein Array verwenden. Bei Tutorials musst du darauf achten, das es OpenGL 3.3 Tutorials sind. Bei den Shadern war früher die Syntax etwas anders. |
Autor: | mathias [ So Dez 15, 2013 17:56 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Dann habe ich da wieder mal was altes erwischt, als ich was über Licht suchte. http://wiki.delphigl.com/index.php/Tuto ... l-Lighting Momentan suche ich was über Licht. |
Autor: | glAwesome [ So Dez 15, 2013 18:16 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
mathias hat geschrieben: Dann habe ich da wieder mal was altes erwischt, als ich was über Licht suchte. http://wiki.delphigl.com/index.php/Tuto ... l-Lighting *alten Post rauskram* glAwesome hat geschrieben: Die Sprache hat sich nicht soo grundsätzlich geändert. Die wesentlichen Änderungen sind:
|
Autor: | OpenglerF [ So Dez 15, 2013 18:46 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Also bei Licht muss man jetzt ein wenig anders vorgehen, weil im Gegensatz zu früher als eine kleine feste Menge an Möglichkeiten vorgegeben war, man jetzt das Lighting selber programmieren kann. Im Gegensatz zu früher, solltest du dir jetzt also erstmal überlegen, was du überhaupt benötigst um genau das dann in GLSL umzusetzen. Ich würde für den Anfang mal ein Pointlight umsetzen. Directionallight kann man damit im Prinzip ersetzen, wenn man die Lichtquelle weit genug weg setzt und Spotlights sind eher selten notwendig und sind außerdem genau genommen ein Pointlight mit einen Schatten außenrum. Viele Anwendungen brauchen auch kein Lighting oder es läuft da komplett anders ab. (2D) Wie in einen anderem Thema bereits ausgeführt, würde ich auch davon absehen, die Materialeigenschaften farbig zu speichern wie es auch früher in der Fixed-Pipeline der Fall war. Außerdem macht es heutzutage Sinn, die Lichtberechnung pro Fragment und nicht pro Vertex auzuführen. Gerade Glanzlicht sieht dann einfach deutlich besser aus und die Modelle müssen für gute Lichter nicht mehr unterteilt werden. Diesen Code sollte für ein Point Light funktionieren, du musst ihn also möglicherweise noch erweitern. (zb. mehrere Lichter) Da ich ihn jetzt auf die Schnelle nicht ausprobiert habe keine 100% Funktionsgarantie. Code:
|
Autor: | mathias [ So Dez 15, 2013 22:45 ] | ||
Betreff des Beitrags: | Re: Wieso funktioniert dies ? | ||
Ich habe die Werte durch Konstanten ersetzt und die Texturenfunktion gelöscht. Von Licht keine Spur. Das einzige die Farben sehen komisch aus. Wen wenigsten die Farben beim drehen sich ändern würden. Habe ich da mit Normal und Position einen Fehler ? Fragmentshader: Code:
Vertexshader: Code:
|
Autor: | glAwesome [ So Dez 15, 2013 23:28 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Zum Fragmentshader: Code:
Zum Vertexshader: Du solltest nicht den Positionsvektor als Normalenvektor missbrauchen. Steck die Normalen einfach mit ins VBO. Möglicherweise möchtest du inPos nicht einfach nach Position kopieren, sondern vorher mit meinMatrix multiplizieren. Dann vergiss nicht, Dies mit dem Normalenvektor ebenfalls zu tun: Code:
|
Autor: | OpenglerF [ Mo Dez 16, 2013 14:12 ] |
Betreff des Beitrags: | Re: Wieso funktioniert dies ? |
Ich vermute, die Normalen stimmen nicht. Du kannst auch einfach mal zum Testen die eizelnen Wertei wie Normalen im Shader ausgeben lassen. Also einfach zum Beispiel: "FragColor = vec4(NormalizedNormal, 1.0);" Zitat: Dann vergiss nicht, Dies mit dem Normalenvektor ebenfalls zu tun: Das stimmt, allerdings sollte das so nicht funktionieren. Ich habe gerade so im Kopf, dass man Normalen mit der transponierten inversen Matrix multiplizieren muss. Warum das so ist, kann ich allerdings auch gerade nicht sagen, aber es gibt sicher einen mathematischen Grund. |
Autor: | mathias [ Mo Dez 16, 2013 17:47 ] | ||
Betreff des Beitrags: | Re: Wieso funktioniert dies ? | ||
Zitat: Fließkommazahlen schreibt man in GLSL nicht mit Komma, sondern mit Punkt. Die Klammern brauchst du dabei nicht. Schluckt der Compiler das einfach so? Komisch der Compiler hat das ',' geschluckt, sonst hätte ich dies gemerkt. Vielleicht hat der Compiler dies als Array angenommen. Ich habe die Klammern weggenommen und die ',' durch '.' ersetzt. Der Vertexshader habe ich abgeändert aber es kommt zur Fehlermeldung bei diesen beiden Zeilen. Was kommt in inNormal ? Code:
|
Seite 1 von 3 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |