Registriert: Di Apr 02, 2013 14:54 Beiträge: 8
Programmiersprache: C#
Hallo liebe Community,
ich bin seit dem Ableben von XNA für C# auf OpenGL gewechselt und habe mir mal angeguckt, wie Shader so funktionieren. Und da bin ich recht schnell auf das Wiki gestoßen. Da habe ich das Tutorial durchgearbeitet, aber da ich kein Delphi habe (sondern Visual Studio mit C# als Sprache) und die Befehle nicht so ganz gleich sind, habe ich ein Problem... Und zwar bei dem Shader "Eingang".
Und zwar möchte ich zum probieren beispielsweise im Fragmentshader die gl_FragColor ändern, indem ich die Ausgangsfarbe nehme und einfach... die Farben durcheinander mixe oder so Da hab ich mir gedacht:
gl_FragColor = Color;
Das liefert keine Fehler, aber ein sehr... komisches Bild.
Oder wenn ich versuche, mit GL.Uniform4 eine Farbe zu übergeben, stürzt mein Programm ab, oder es funktioniert nicht. Da weiß ich jetzt nicht, ob ich den falschen Befehl benutzt habe, oder etwas am Shader nicht stimmt... Wie sieht der Shader eigentlich aus, wenn er ein Variablen-Input akzeptieren soll?
Und noch eine dritte Frage: Laut Tutorial sollte man die Version angeben (#version 1.50), das liefert mir 2 Fehler: 1. Syntax Error, 2. Not Supported by OGL Driver Jetzt frage ich mich natürlich, was soll den stattdessen hinkommen? Mein interner Chipsatz meldet 3.30, aber wenn ich es so eingebe, bekomme ich die selben Fehler...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Erstmal willkommen.
Bei der Beantwortung deiner Fragen stößt man auf mehrere Probleme, die meisten haben damit zu tun, dass du keinen Code mit angegeben hast. Nutze dafür am besten die Code-Tags: [code=c#]...[ /code] sollte das tun, was du willst.
Zu der letzten Frage: Ist dein Grafikkartentreiber aktuell?
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
ERROR: 0:? : 'gl_ModelViewProjectionMatrix' : variable is not available in current GLSL version
ERROR: 0:? : 'gl_Vertex' : variable is not available in current GLSL version
ERROR: 0:? : 'gl_Color' : variable is not available in current GLSL version
Scheinbar ist letztere Schreibweise richtig, aber warum sind die Variablen nicht verfügbar? Wenn ich #version weglasse, funktioniert es ohne Fehlermeldung.
Zum fehlenden Code... ich bin mir nicht sicher, ob C#-Code hier auch richtig ist?
Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
matze hat geschrieben:
Für #version 330/150/400
Code:
ERROR: 0:? : 'gl_ModelViewProjectionMatrix' : variable is not available in current GLSL version
ERROR: 0:? : 'gl_Vertex' : variable is not available in current GLSL version
ERROR: 0:? : 'gl_Color' : variable is not available in current GLSL version
Scheinbar ist letztere Schreibweise richtig, aber warum sind die Variablen nicht verfügbar? Wenn ich #version weglasse, funktioniert es ohne Fehlermeldung.
#version gibt die GLSL-Version an, die du benutzt. #version 330 ist demnach GLSL 3.30, und das sieht die Verwendung von gl_ModelViewProjectionmatrix usw. nicht mehr vor, denn die sind veraltet. Natürlich kann man sie weiterhin benutzen - nur nicht mit GLSL 3.30.
matze hat geschrieben:
gl_FrontColor = gl_Color; //ob ich nun gl_Color oder nur Color angebe, immer das falsche komische Bild, scheinbar gibt es keine solche Variable?[/code]
Hm, bist du sicher dass du die Farbe überhaupt gesetzt hast? In dem von dir gezeigten Code sehe ich keinen entsprechenden Aufruf. Außerdem musste man soweit ich weiß im Vertexshader ein "gl_FrontColor = gl_Color;" haben damit er die Farbe setzt. Nur so bekommt der Fragmentshader auch die korrekten Werte rübergerreicht. Beispiele für GLSL gibts übrigens hier.
Warum dein uniform-Teil abschmiert, dazu kann ich leider nichts sagen, C# habe ich nie eingesetzt. Ich denke da wirst du den Debugger befragen müssen um herauszufinden wo genau sich dein Programm verabschiedet.
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Registriert: Di Apr 02, 2013 14:54 Beiträge: 8
Programmiersprache: C#
Hallo, Mh ist ziemlich... komisch :/
Ich habe auch die Version 1.50 damit probiert... Funktioniert auch nicht. Aber das Tutorial zeigt ja alles mit Version 1.5. Und da sollte es auch bei mir klappen.
darkinsanity hat geschrieben:
matze hat geschrieben:
gl_FrontColor = gl_Color; //ob ich nun gl_Color oder nur Color angebe, immer das falsche komische Bild, scheinbar gibt es keine solche Variable?[/code]
Ich habe gl_FragColor benutzt. Und die gibt es im Fragment-Shader... oder?
darkinsanity hat geschrieben:
Außerdem musste man soweit ich weiß im Vertexshader ein "gl_FrontColor = gl_Color;" haben damit er die Farbe setzt. Nur so bekommt der Fragmentshader auch die korrekten Werte rübergerreicht.
Also... Der Vertex-Shader führt für jedes Dreieck seine Befehle aus, danach gibt er (welche?) Daten an den Fragment-Shader, der am Ende die dargestellten Pixel noch Dinge berechnet (Einfärben, Blur, Unschärfe, Glow, Antialising(?)). So richtig? Mh... wahrscheinlich sollte ich mir einfach noch andere Tutorials suchen...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Von haus aus werden nur die Eingebauten Varyings von Vertex zu Fragmentshader gegeben (die Liste stimmt vermutlich nicht mehr für GL3+ und so, aber für OpenGL 2.x sollte das passen).
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
matze hat geschrieben:
Ich habe auch die Version 1.50 damit probiert... Funktioniert auch nicht. Aber das Tutorial zeigt ja alles mit Version 1.5. Und da sollte es auch bei mir klappen.
GLSL 1.5 gehört zu OpenGL 3.2. Da gibt es auch kein gl_Color mehr. Kann es sein, dass du hier die GLSL-Version mit der OpenGL-Version verwechselst? Das sind zwei unterschiedliche Dinge. Mit #version gibst du lediglich die GLSL-Version an - nicht die OpenGL-Version. #version 150 z.B. steht für GLSL 1.5, und das gehört zu OpenGL 3.2. /edit: Ich hab gerade ins Wiki gesehen. Jetzt weiß ich warum du verwirrt bist. Da steht zwar "#version 1.50", aber das ist afaik nicht korrekt, denn das müsste, wenn überhaupt, "#version 150" heißen. Weiterhin geht es in dem Tutorial um GLSL 1.0, daher fehlt dort ein Hinweis dass man mit "#version 150" eben dafür sorgt dass GLSL 1.5 verlangt wird. Wenn du ansonsten dem Tutorial gefolgt bist, erklärt das auch die Fehler die dir der Shadercompiler gemeldet hat: Dein Code ist GLSL 1.0, mit #version 150 erklärst du ihm aber dass dein Code GLSL 1.5 wäre. Entferne am besten einfach die #version-Zeile in deinen Shadern. Die ist eigentlich nur dann nützlich wenn du eine sehr neue Version benutzt, bei der nicht sicher ist ob sie überall unterstützt wird. Sieh dir dazu am besten einfach nochmal die Beispielshader an. Die sind genau so ohne Änderungen lauffähig und funktionieren.
matze hat geschrieben:
darkinsanity hat geschrieben:
matze hat geschrieben:
gl_FrontColor = gl_Color; //ob ich nun gl_Color oder nur Color angebe, immer das falsche komische Bild, scheinbar gibt es keine solche Variable?[/code]
Ich habe gl_FragColor benutzt. Und die gibt es im Fragment-Shader... oder?
Stimmt. Allerdings muss der Fragmentshader ja auch erstmal wissen, welche Farbe er setzen soll. Und das bekommt er eben mit gl_FrontColor = gl_Color im Vertexshader mitgeteilt. Damit enthält dann im Fragmentshader gl_Color den angegebenen Wert und weißt ihn gl_FragColor zu. Der Vertexshader bekommt seinerseits die Farbe übergeben die du z.B. per glColor3f gesetzt hast.
matze hat geschrieben:
Also... Der Vertex-Shader führt für jedes Dreieck seine Befehle aus,
Nicht ganz korrekt. Geometry-Shader würden per Dreieck (bzw. Polygon) ausgeführt werden. Vertexshader werden einmal pro Vertex aufgerufen, also für ein Dreieck drei mal, da es ja schließlich drei Ecken und somit drei Vertices hat.
matze hat geschrieben:
danach gibt er (welche?) Daten an den Fragment-Shader,
Für OpenGL 2.x gibt es die eingebauten Veryings, die Lord Horazont bereits erwähnt hat, diese werden automatisch vom Vertexshader an den Fragmentshader weitergegeben, allerdings bist du selbst dafür verantwortlich ihnen korrekte Werte zuzuweisen. Bei OpenGL 3.x bist du dann auch schließlich für die Übergabe von Werten selbst verantwortlich.
matze hat geschrieben:
der am Ende die dargestellten Pixel noch Dinge berechnet (Einfärben, Blur, Unschärfe, Glow, Antialising(?)). So richtig?
Ein Fragmentshader kann nur den Pixel ausgeben, für den er ausgeführt wird, er kann keine anderen beeinflussen. Die GPU will ja schließlich parallel rechnen, und das geht nur dann sinnvoll wenn sich die parallelen Operationen nicht gegenseitig stören. D.h. Blur, Unschärfe, Glow und Antialiasing sind nicht ohne weiteres im Fragmentshader realisierbar. Dafür braucht man Post-Processing.
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Mitglieder in diesem Forum: 0 Mitglieder und 11 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.