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

Aktuelle Zeit: Mi Jul 02, 2025 04:16

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Shader Input?
BeitragVerfasst: Di Apr 02, 2013 20:15 
Offline
DGL Member

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 :D
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...

mfg
matze


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader Input?
BeitragVerfasst: Mi Apr 03, 2013 17:45 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader Input?
BeitragVerfasst: Do Apr 04, 2013 07:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
matze hat geschrieben:
#version 1.50

Sollte das nicht eher
Code:
  1. #version 150
heißen?

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader Input?
BeitragVerfasst: Sa Apr 06, 2013 14:58 
Offline
DGL Member

Registriert: Di Apr 02, 2013 14:54
Beiträge: 8
Programmiersprache: C#
Hallo,

danke erstmal für die Antworten.

Mein Treiber für den internen Chipsatz war nicht aktuell, ich habe ihn gepatcht.
Durch den neuen Treiber liefert mir der Chipsatz nun als Version:

Code:
  1. 4.00 - Build 9.18.10.3071


Ich bekomme nun folgende Fehler:

Für #version 3.30/1.50 (für beide Shader die gleichen Fehler...)
Code:
  1.  
  2. ERROR: 0:? : '' : Incorrect GLSL version: 3 (bzw. 1)
  3. ERROR: 0:1 : '#version' : syntax error
  4.  


Für #version 330/150/400
Code:
  1.  
  2. ERROR: 0:? : 'gl_ModelViewProjectionMatrix' : variable is not available in current GLSL version
  3. ERROR: 0:? : 'gl_Vertex' : variable is not available in current GLSL version
  4. ERROR: 0:? : 'gl_Color' : variable is not available in current GLSL version
  5.  


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?

Hier meine Shader:

Vertex-Shader:
Code:
  1.  
  2. #version 3.30
  3. void main(){
  4.   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  5. }
  6.  


Fragment-Shader:
Code:
  1.  
  2. #version 3.30
  3. void main(){
  4.   gl_FragColor = gl_Color; //ob ich nun gl_Color oder nur Color angebe, immer das falsche komische Bild, scheinbar gibt es keine solche Variable?
  5. }
  6.  


Initialisierung Fenster:
Code:
  1. void MainWindow_Load(object sender, EventArgs e)
  2.         {
  3.             WindowBorder = OpenTK.WindowBorder.Hidden;
  4.             WindowState = OpenTK.WindowState.Fullscreen;
  5.             GL.ClearColor(0.1f, 0, 0, 1f);
  6.  
  7.             model = new Model(new Vector3(0,0,0)); //Erstellt testweise eine Kugel
  8.  
  9.             Console.WriteLine(GL.GetString(OpenGL.StringName.ShadingLanguageVersion));
  10.  
  11.             programobj = GL.CreateProgram();
  12.  
  13.             vertexshader = GL.CreateShader(OpenGL.ShaderType.VertexShader); //Pointer auf Shader (vom Typ int)
  14.             fragmentshader = GL.CreateShader(OpenGL.ShaderType.FragmentShader); //Pointer auf Shader (vom Typ int)
  15.  
  16.             GL.ShaderSource(vertexshader, vertexstring); //vertexstring enthält Shader Code
  17.             GL.ShaderSource(fragmentshader, fragmentstring); //fragmentstring enthält Shader Code
  18.  
  19.             GL.AttachShader(programobj, vertexshader);
  20.             GL.AttachShader(programobj, fragmentshader);
  21.  
  22.             GL.CompileShader(vertexshader);
  23.             GL.CompileShader(fragmentshader);
  24.  
  25.             Console.WriteLine(GL.GetShaderInfoLog(vertexshader));
  26.             Console.WriteLine(GL.GetShaderInfoLog(fragmentshader));
  27.  
  28.             GL.LinkProgram(programobj);
  29.  
  30.             GL.DeleteShader(vertexshader);
  31.             GL.DeleteShader(fragmentshader);
  32.         }


Render Loop:
Code:
  1. void MainWindow_RenderFrame(object sender, FrameEventArgs e)
  2.         {
  3.             rot += 0.5f; //Kugeldrehung
  4.  
  5.             GL.Clear(OpenGL.ClearBufferMask.DepthBufferBit | OpenGL.ClearBufferMask.ColorBufferBit | OpenGL.ClearBufferMask.AccumBufferBit | OpenGL.ClearBufferMask.StencilBufferBit);
  6.  
  7.             GL.LoadIdentity();
  8.  
  9.             GL.Viewport(new System.Drawing.Rectangle(0, 0, this.Width, this.Height));
  10.             GL.MatrixMode(OpenGL.MatrixMode.Projection);
  11.             float aspect = (float)this.Width / (float)this.Height;
  12.             GL.Ortho(-aspect, aspect, -1, 1, -1, 1);
  13.  
  14.             GL.Enable(OpenGL.EnableCap.DepthTest);
  15.  
  16.             GL.Scale(0.8f, 0.8f, 0.8f);
  17.             GL.Rotate(rot, 0.1f, 1.0f, 0.0f); //dreht die Kugel langsam, dass ich alle Seiten sehe
  18.            
  19.             GL.UseProgram(programobj);
  20.  
  21.             model.Draw(); //Zeichnet die Dreiecke für die Kugel
  22.  
  23.             SwapBuffers();
  24.         }


Wenn ich eine Variable übergeben möchte, dann weiß ich nicht ganz, wie ich das machen soll, ich habe mir gedacht so:

Code:
  1. uniform vec4 farbe;
  2.  
  3. ...
  4. gl_FragColor = farbe;
  5. ...


und im Programm:
Code:
  1. GL.Uniform4(GL.GetUniformLocation(programobj, "farbe"), new Color4(1.0f, 0.0f, 0.0f, 1.0f));


Aber da stürzt das Programm ab. Also meine Konsole öffnet sich, dann das Fenster für meine 3D-Objekte, das schließt sich dann sofort wieder.

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader Input?
BeitragVerfasst: So Apr 07, 2013 00:05 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2. ERROR: 0:? : 'gl_ModelViewProjectionMatrix' : variable is not available in current GLSL version
  3. ERROR: 0:? : 'gl_Vertex' : variable is not available in current GLSL version
  4. ERROR: 0:? : 'gl_Color' : variable is not available in current GLSL version
  5.  


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader Input?
BeitragVerfasst: Do Apr 11, 2013 19:27 
Offline
DGL Member

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...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader Input?
BeitragVerfasst: Do Apr 11, 2013 22:07 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader Input?
BeitragVerfasst: Fr Apr 12, 2013 23:47 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader Input?
BeitragVerfasst: Fr Apr 19, 2013 20:28 
Offline
DGL Member

Registriert: Di Apr 02, 2013 14:54
Beiträge: 8
Programmiersprache: C#
Hallo,

Jetzt läuft es :)
Ohne Versionsangabe läuft es ohne Fehlermeldung und wenn ich im Vertex-Shader die glFrontColor angebe, läuft auch der Fragment-Shader.

Vielen Dank :)


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


Wer ist online?

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.

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