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

Aktuelle Zeit: Mi Mai 15, 2024 12:16

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: ModelViewMatrix aus VertexShader
BeitragVerfasst: Mi Feb 22, 2012 09:53 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Hallo,

Ich bin gerade dabei ein Programm von CG nach GLSL zu konvertieren. Ich habe dabei ein Problem mit folgender Routine:

Code:
  1. cgGLSetMatrixParameter(cgGetNamedParameter(vertProg,'ModelViewProj'),CG_GL_MODELVIEW_PROJECTION_MATRIX,CG_GL_MATRIX_IDENTITY);


Ich habe im Orange Book und auf OpenGL.org gelesen, dass ich die Matrix per glGetUniform auslesen kann, jedoch nur Spaltenweise.
Aber weiss nicht genau wie.
Und wie ersetze ich das cgGLSetMatrixParameter?

Mit besten Grüssen,

Heavenssake007


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ModelViewMatrix aus VertexShader
BeitragVerfasst: Mi Feb 22, 2012 13:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
In OpenGL 2.x gibt es noch die eingebauten Uniforms, in diesem Fall brauchst du wohl gl_ModelViewProjectionMatrix.
Diese Matrix kommt ganz normal vom OpenGL-Matrixstack. Aus dem CG_GL_MATRIX_IDENTITY schließe ich mal das hier die Einheitsmatrix gesetzt wird, also das wohl ca. das hier:
Code:
  1. glMatrixMode(GL_PROJECTION);
  2. glLoadIdentity();
  3. glMatrixMode(GL_MODELVIEW);
  4. glLoadIdentity();

In dem Zusammenhang siehe natürlich auch glLoadMatrix. Im Shader ist das dann wie gesagt gl_ModelViewProjectionMatrix.


Alternativ kannst du natürlich auch ein eigenes Uniform vom Typ mat4 definieren und dort die Matrix entsprechend übergeben. Ab OpenGL 3.3 (?) musst du das sogar. Ein solches lässt sich dann via glUniformMatrix setzen.


Nachtrag/Edit:
glGetUniform ist zum auslesen der Uniform-Variable da. Wegen dem "Set" nehme ich an du willst schreiben, nicht lesen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ModelViewMatrix aus VertexShader
BeitragVerfasst: Mi Feb 22, 2012 15:19 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
@CoolCat Vielen Dank für die schnelle Antwort.

Kann es sein, dass diese Zeilen schon ausreichen würde um genau dasselbe zu tun wie der CG-Ausdruck?

Code:
  1.  
  2. loc := glGetUniformLocation(ProgObject,PAnsiChar('ModelViewProj'));
  3. glGetUniformfv(ProgObject,loc,@ModelViewMatrix);
  4. glUniform4fv(loc,1,@ModelViewMatrix);
  5.  


Abgesehen davon, dass ich meinen VertexShader noch anpassen muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ModelViewMatrix aus VertexShader
BeitragVerfasst: Mi Feb 22, 2012 15:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
http://http.developer.nvidia.com/Cg/cgG ... meter.html
So wie ich das verstehe (ohne den geringsten Peil von Cg zu haben) übernimmt dein Aufruf von cgGLSetStateMatrixParameter die ModelviewProjection-Matrix von OpenGL und übergibt sie an die Uniformvariable mit dem Namen "ModelViewProj". Hier wird also gar nicht, wie ich im ersten Post vermutet hatte die Matrix direkt gesetzt, sondern eben nur die Anweisung gegeben die Matrix von OpenGL zu übernehmen.

Der einfachste Weg ist entsprechend sämtliche Vorkommen von "ModelViewProj" im Shader durch "gl_ModelViewProjectionMatrix" zu ersetzen. Auf Seiten des Clients, also in deinem normalen Code musst du nichts weiter machen. Dieses Vorgehen funktioniert solange es den OpenGL-Matrixstack noch gibt. Wie zuvor erwähnt wurde dieser mit OpenGL 3.0 als deprecated eingestuft und mit OpenGL 3.3. entfernt.

Für den Fall das du mit einer neueren OpenGL-Version arbeitest (würdest du wissen weil du das explizit angeben musst): Dort wird die ModelViewProjection-Matrix von deinem eigenen Code verwaltet, eben nicht mehr von OpenGL! Das liegt daran das die meisten professionellen Entwickler (wenn nicht alle) die OpenGL-Mathefunktionen eh durch eigene ersetzt hatten.
Code:
  1. // hier ModelViewProjectionMatrix sinnvoll setzen
  2.  
  3. // an Shader übergeben
  4. loc := glGetUniformLocation(ProgObject,PAnsiChar('ModelViewProj'));
  5. glUniformMatrix4fv(loc,1, false, @ModelViewProjectionMatrix);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ModelViewMatrix aus VertexShader
BeitragVerfasst: Di Feb 28, 2012 12:59 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Vielen Dank für Deine Hilfe Coolcat.
Ich habs über die fixed functions im Vertex Shader gelöst:

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

Das funktioniert sehr gut.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.022s | 19 Queries | GZIP : On ]