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

Aktuelle Zeit: Di Mai 14, 2024 01:53

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Shader korrekt anwenden
BeitragVerfasst: Sa Apr 21, 2012 16:03 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Hi,
ich versuche mich zurzeit an Shadern und habe da so einige Fragen. Ich lade den Shader wie folgt ein:

Code:
  1. // Programm Objekt erstellen
  2.   ProgramObject        := glCreateProgram;
  3.  
  4.   //Vertex und Fragmentshader erstellen
  5.   VertexShaderObject   := glCreateShader(GL_VERTEX_SHADER);
  6.   FragmentShaderObject := glCreateShader(GL_FRAGMENT_SHADER);
  7.  
  8.   //Vertex und Fragment Code einladen
  9.   sl_ver := TStringList.Create;
  10.   sl_frag := TStringList.Create;
  11.  
  12.  
  13.   sl_ver.LoadFromFile(  ExtractFilePath(Application.Exename) + 'shader'+ s_name + '.ver' );
  14.   sl_frag.LoadFromFile( ExtractFilePath(Application.Exename) + 'shader'+ s_name + '.frag' );
  15.  
  16.  
  17.  
  18.   vertex_code := sl_ver.Text;
  19.   vertex_len := length(vertex_code);
  20.   fragment_code := sl_frag.Text;
  21.   fragment_len := length(fragment_code);
  22.  
  23.   sl_ver.Destroy;
  24.   sl_frag.Destroy;
  25.  
  26.  
  27.   //Quellcode einladen
  28.   glShaderSource(VertexShaderObject, 1,  @vertex_code,   @vertex_len);
  29.   glShaderSource(FragmentShaderObject, 1, @fragment_code, @fragment_len);
  30.  
  31.  
  32.  
  33.   //Code compilieren
  34.   glCompileShader(VertexShaderObject);
  35.   glCompileShader(FragmentShaderObject);
  36.  
  37.   //Shader an das Programm Objekt anhängen
  38.   glAttachShader(ProgramObject, VertexShaderObject);
  39.   glAttachShader(ProgramObject, FragmentShaderObject);
  40.  
  41.   //Ressourcen freigeben
  42.   glDeleteShader(VertexShaderObject);
  43.   glDeleteShader(FragmentShaderObject);
  44.  
  45.   //Shader linken
  46.   glLinkProgram(ProgramObject);


Eine Fehler-Überprüfung gibt nichts aus, d.h. es wird alles komplet verarbeitet. Ich versuche einen einfachen perPixel-Lighting Shader einzubinden [http://wiki.delphigl.com/index.php/shader_PerPixelLighting]. Allerdings weiß ich nun nicht genau wie ich den Shader nun aktiviere und die Variablen setze. In der Beschreibung steht es wird wie bei OpenGl aufgerufen, d.h. ich rufe folgenden Code auf:

Code:
  1. glDisable(GL_LIGHTING);
  2.   myShader.ActivateShader('perPixel');
  3.   glLightfv( GL_LIGHT0 , GL_AMBIENT  , @light0_ambient[0]  );
  4.   glLightfv( GL_LIGHT0 , GL_DIFFUSE  , @light0_diffuse[0]  );
  5.   glLightfv( GL_LIGHT0 , GL_POSITION , @light0_position[0] );
  6.  
  7.   glLightfv( GL_LIGHT1 , GL_AMBIENT  , @light1_ambient[0]  );
  8.   glLightfv( GL_LIGHT1 , GL_DIFFUSE  , @light1_diffuse[0]  );
  9.   glLightfv( GL_LIGHT1 , GL_POSITION , @light1_position[0] );
  10.  
  11.  
  12.   glEnable(GL_LIGHT0);
  13.   glEnable(GL_LIGHT1);
  14.  
  15.  
  16.   // Kamera einstellen
  17.   glTranslatef(0, 0, -dist);
  18.   glRotatef(Time, 0.1, 0.5, 0.5);
  19.  
  20.   with CenterPos do
  21.     glTranslatef(-x, -y, -z);
  22.  
  23.  
  24.   // Das Objekt zeichnen
  25.  
  26.   glColor3f(1,0,0);
  27.   RenderCylinder;
  28.   myShader.DeactivateAllShader;


myShader ist eine Klasse welche die Shader verwaltet. Ich aktiviere den Shader per glUseProgram. Allerdings wird das gesamte Objekt nun schwarz gezeichnet... Was mache ich falsch?

Irgendwie finde ich nichts im Netz wie man nun Shader korrekt aufruft, und ich denke daran liegt es

lg

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader korrekt anwenden
BeitragVerfasst: Sa Apr 21, 2012 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Ich weiß nicht ob du direkt mit dem Tutorial angefangen hast, aber eine Sache ist mal extremst wichtig, die leider im TUT nicht drinsteht.
Den Shadercode umbedingt vom typ AnsiString übergeben!! (also fals du Delphi benutzt...)

Also deine
vertex_code := sl_ver.Text;
fragment_code := sl_frag.Text;

Schau das hier deine Vairablen umedingt vom Typ AnsiString sind sonst rühren sich Shader bei OpenGL mal gar nicht!
lg

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader korrekt anwenden
BeitragVerfasst: Sa Apr 21, 2012 18:19 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Ja, vertex_code und fragment_code sind vom Typ AnsiString und ja ich benutze Delphi 2010 - hatte auch schon Ärger mit AnsiString <=> String

Hier ist meine Variablendeklaration
Code:
  1. var  VertexShaderObject   : GLhandle;
  2.     FragmentShaderObject : GLhandle;
  3.  
  4.     sl_ver,
  5.     sl_frag       : TStringList;
  6.  
  7.     vertex_code,
  8.     fragment_code : AnsiString;
  9.  
  10.     vertex_len,
  11.     fragment_len  : integer;


Habe mir auch schon testweise die beiden Variablen ausgegeben und sie enthalten den passenden Code - daran sollte es nicht liegen

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader korrekt anwenden
BeitragVerfasst: Sa Apr 21, 2012 18:53 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
glUseProgram ist richtig. Die Shadervariablen kannst du mit glUniform setzen. Dafür brauchst du deren Location. Diese wiederum bekommst du mit glGetUniformLocation. Also in deinem Fall:
Code:
  1. glUniform1i(glGetUniformLocation(ProgramObject, 'Texture0'), 0);

Edit hat sich an das ProgramObject erinnert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader korrekt anwenden
BeitragVerfasst: So Apr 22, 2012 09:13 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
mrtrain hat geschrieben:
glUseProgram ist richtig. Die Shadervariablen kannst du mit glUniform setzen. Dafür brauchst du deren Location. Diese wiederum bekommst du mit glGetUniformLocation. Also in deinem Fall:
Code:
  1. glUniform1i(glGetUniformLocation(ProgramObject, 'Texture0'), 0);

Edit hat sich an das ProgramObject erinnert.


Okay, dass ich so Texturen setzen kann sehe ich ein, da Texture0 als uniform variable deklariert wurde im Fragment-Shader. Leider ist die Licht-Position keine uniform variable, also kann ich sie ja nicht auch so setzen oder?

Wie genau übergebe ich dem Shader jetzt meine Lichtdaten (Position, Ambiente, ... ) ?

Mich verwirrt dieser Satz aus der Beschreibung des Shaders:
Zitat:
Licht- und Materialinformationen werden wie beim normale OpenGL-Licht übergeben, vor der Verwendung dieses Shaders sollte es aber mit glDisable(GL_LIGHTING); ausgeschaltet werden.

Das Normale OGL-Light setze ich per glLightfv(..) nur klappt das mit dem Shader nicht.. Auf die Daten im Shader die ich gerne setzen würde (gl_LightSource) darf ich nicht per glUniform zugreifen, da sie geschützt sind...

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader korrekt anwenden
BeitragVerfasst: So Apr 22, 2012 11:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Dafür gibt es separate Variablen im Shader, siehe Eingebaute Uniformvariablen in glSlang. Die musst du nicht explizit setzen, darüm kümmert sich der Treiber.

greetings

_________________
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 korrekt anwenden
BeitragVerfasst: So Apr 22, 2012 20:09 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Ah okay, ich habe den Fehler gefunden, es lag am Fragment-shader bzw an meiner nicht existenten Textur. Ich hab die Zeile

Code:
  1. gl_FragColor = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) * texture2D(Texture0, vec2(gl_TexCoord[0])) + ISpecular);


in

Code:
  1. gl_FragColor   = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) + ISpecular);


umgeändert und es geht. Warscheinlich ist der Wert zu Null multipliziert worden was mein schwarz erklären würde.


Warscheinlich hat das mrtrain in seinem Post gemeint und ich habs nur nicht gerafft. Mühsam ernährt sich das Eichhörnchen oder wie war das? :mrgreen:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shader korrekt anwenden
BeitragVerfasst: So Apr 22, 2012 23:32 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Die Uniform Location kannst du übrigens zwischenspeichern. Die muss man nur nach dem Neu-Linken des Shaders aktualisieren.

_________________
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.032s | 19 Queries | GZIP : On ]