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

Aktuelle Zeit: So Aug 03, 2025 15:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Erster versuch mit GLSL
BeitragVerfasst: Do Jul 20, 2006 09:37 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

wollte mal fragen wie genau das funzt mit GLSL und VBO´s.
Ich bekomms leider nicht hin, das ich was sichtbares bekomm :(

Hier sind die zwei shader:

Vertex shader:
Code:
  1.  
  2. attribute vec2 mytexcoord;
  3.  
  4. varying vec2 Texcoord;
  5.  
  6. void main( void )
  7. {
  8.     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  9.     Texcoord    = mytexcoord.xy;
  10.    
  11. }
  12.  


Fragment shader:
Code:
  1.  
  2. uniform sampler2D baseMap;
  3.  
  4. varying vec2 Texcoord;
  5.  
  6. void main( void )
  7. {
  8.     gl_FragColor = texture2D( baseMap, Texcoord );
  9.    
  10. }
  11.  


und so render ich den VBO:

Code:
  1.  
  2.             // Bind VBO
  3.             glBindBuffer(GL_ARRAY_BUFFER_ARB, surfaces[i].vboid);
  4.  
  5.             // Bind simple shader
  6.             gSimpleShaderPrg->Bind();
  7.             apos = gSimpleShaderPrg->GetAttribLocation("tcoord");
  8.             glEnableVertexAttribArrayARB(apos);
  9.             glVertexAttribPointerARB(apos,2,GL_FLOAT,0,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 4));
  10.  
  11.             if (surfaces[i].shader) surfaces[i].shader->Bind(); // <- das hat nix mit shader zu tun, das ist sowas wie die q3 shader scripts (da wird auch die texturen gebunden)
  12.             gRenderMng->DrawArrays(0, surfaces[i].numindices, true);
  13.             if (surfaces[i].shader) surfaces[i].shader->Unbind(); // <- das hat nix mit shader zu tun, das ist sowas wie die q3 shader scripts
  14.  
  15.             // Unbind simple shader
  16.             glDisableVertexAttribArrayARB(apos);
  17.             gSimpleShaderPrg->Unbind();
  18.  
  19.             // Unbind VBO
  20.             glBindBuffer(GL_ARRAY_BUFFER_ARB,0);
  21.  


Der letzte parameter in glVertexAttribPointerARB gibt ja an, auf welcher Pointer position sich die Daten befinden.
Und das ist mein vertex array mit (position, normalen, tangente, binormale und texture korrdinate)
Deswegen * 4. Das sollte also stimmen.

Wenn wer ne idee hat, bitte melden... kenn mich mit GLSL nich gut aus
Danke vielmals,

Final


Dateianhänge:
Dateikommentar: Wenigstens etwas, aber nicht wirklich korrekt :(
r3d_bafadfas.JPG [25.75 KiB]
78-mal heruntergeladen
Dateikommentar: So passt alles ;) das ist aber der normale pfad ohne shader :(
r3dtechdemo0002.JPG [89.42 KiB]
103-mal heruntergeladen


Zuletzt geändert von Finalspace am Do Jul 20, 2006 14:56, insgesamt 2-mal geändert.
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 20, 2006 13:39 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Ich würde am anfang nicht eigene Attribute benutzen, sondern die schon vorhandenen Texturkoordinaten nutzen. Ansonsten probier die VBOs ersteinmal ohne shader aus (Geht natürlich nur sinvoll mit vohrhandenen Texturkoordinaten) und benutz dann erst einmal die Shader aus dem Wiki.

Manchmal ist es auch sinvoll die opengl befehle nicht in Objekten zu kapseln. Das macht anderen es gerade zu unmöglich den code durchzuschauen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 20, 2006 14:52 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Normale VBOs gehen einwandfrei, ohne shader -.-

Hab jetzt zumindest mal nen bild bekommen, aber die texture koordnaten stimmen immer noch nicht :(

Zitat:
Manchmal ist es auch sinvoll die opengl befehle nicht in Objekten zu kapseln. Das macht anderen es gerade zu unmöglich den code durchzuschauen...


Code:
  1.  
  2. void cR3DShaderProgram::Bind()
  3. {
  4.     if (programobj)
  5.         glUseProgramObjectARB(programobj);
  6.     else
  7.         glUseProgramObjectARB(0);
  8. }
  9.  
  10. void cR3DShaderProgram::Unbind()
  11. {
  12.     glUseProgramObjectARB(0);
  13. }
  14.  


O_o

*vertex und fragment shader geändert oben, sowie das verkorkste bild P


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 20, 2006 16:46 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012

Habs hinbekommen, lag nicht am shader, sondern an der reihenfolge wie die VertexAttribPointer übergeben werden.


Hab da mal nen beispiel gemacht:

Wenn man vertex mit 5 typen hat, beispielsweise (Position, Normal, Tangent, BiNormal, Texcoord) dann muss das rendern so folgen:

Code:
  1.  
  2.             // Bind VBO
  3.             glBindBuffer(GL_ARRAY_BUFFER_ARB, surfaces[i].vboid);
  4.  
  5.             // Bind simple shader
  6.             gSimpleShaderPrg->Bind();
  7.  
  8.             glEnableVertexAttribArrayARB(0);
  9.             glEnableVertexAttribArrayARB(1);
  10.             glEnableVertexAttribArrayARB(2);
  11.             glEnableVertexAttribArrayARB(3);
  12.             glEnableVertexAttribArrayARB(4);
  13.  
  14.             glVertexAttribPointerARB(0,3,GL_FLOAT,0,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 0)); // Position
  15.             glVertexAttribPointerARB(1,2,GL_FLOAT,0,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 4)); // Texcoord
  16.             glVertexAttribPointerARB(2,3,GL_FLOAT,0,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 1)); // Normal
  17.             glVertexAttribPointerARB(3,3,GL_FLOAT,0,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 2)); // Tangent
  18.             glVertexAttribPointerARB(4,3,GL_FLOAT,0,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 3)); // BiNormal
  19.  
  20.             if (surfaces[i].shader) surfaces[i].shader->Bind(); // Texturen binden
  21.             gRenderMng->DrawArrays(0, surfaces[i].numindices, true);
  22.             if (surfaces[i].shader) surfaces[i].shader->Unbind(); // Texturen wegbinden
  23.  
  24.             glDisableVertexAttribArrayARB(4);
  25.             glDisableVertexAttribArrayARB(3);
  26.             glDisableVertexAttribArrayARB(2);
  27.             glDisableVertexAttribArrayARB(1);
  28.             glDisableVertexAttribArrayARB(0);
  29.  
  30.             // Unbind simple shader
  31.             gSimpleShaderPrg->Unbind();
  32.  
  33.             // Unbind VBO
  34.             glBindBuffer(GL_ARRAY_BUFFER_ARB,0);
  35.  


und im shader so drauf zugreifen:

Code:
  1.  
  2. attribute vec2 mytexcoord;
  3. attribute vec3 normal;
  4. attribute vec3 tangent;
  5. attribute vec3 binormal;
  6.  


Das erste attribut sollte ja nach der VertexAttribPointer reihenfolge eigentlich die Position sein, ist aber nicht so, ka wieso :p
Auf jedemfall die nächsten sind dann die folgenden...

Sowas sollte man echt im GLSL tut mal erwähnen ;)


Dateianhänge:
Dateikommentar: Rumspielerei ;)
r3d_bafadfas2.JPG [139.46 KiB]
67-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 20, 2006 16:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Rein interessehalber, hast du die Performance zwischen "normal", VBO und Shader VBO mal verglichen?

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 20, 2006 20:20 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Shader VBO:
Maximal reached fps: 807.19
Minimal reached fps: 196.00

Normal VBO:
Maximal reached fps: 799.00
Minimal reached fps: 213.00

Wenn mans zur laufzeit umschaltet, dann ist normales VBO schneller.
Aber hab gemerkt das es mit ATI noch probs gibt, kolleg mit ner Radeon 9800 pro, geht zwar alles... nur sieht das bild genauso verkorst aus wie oben.
Sprich die texcoords fehler :(

*EDIT:

mist, bei ATI machts probleme :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 20, 2006 22:14 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
ICh will noch mal dran erinnern, dass es sinn macht die bekannten vec4 gl_MultiTexCoord0..7 vec4 gl_Normal und vec4 gl_Color aus der festen Pipeline zu benutzen. Diese brauchen dann auch nicht extra deklariert werden


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 21, 2006 00:02 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ok habs auch hingekriegt, dank diesen dokuments, welches ich mühsam gesucht hab -.-

http://gpwiki.org/index.php/OpenGL:Tutorials:GLSL_Bump_Mapping

ATI hat probleme mit glVertexAttribPointerARB() und funktioniert nur wanns will :(
Das problem gabs schon des öferen, wurde auch hier im Shader forum diskutiert.
Siehe: http://www.delphigl.com/forum/viewtopic.php?t=4016

Auf jedemfall jetzt gehts, und ich lass es auch so :D

Musste den shader bissel versimplern, genau wie du gesagt hast, direkt gl_Texcoord benutzen und nicht über wege über attribts machen.

Code:
  1.  
  2. attribute vec3 tangent;
  3. attribute vec3 binormal;
  4.  
  5. void main( void )
  6. {
  7.     gl_Position = ftransform();
  8.     gl_TexCoord[0] = gl_MultiTexCoord0;
  9. }
  10.  


Code:
  1.  
  2. uniform sampler2D baseMap;
  3. uniform float overbright;
  4.  
  5. void main( void )
  6. {
  7.     gl_FragColor = texture2D( baseMap, gl_TexCoord[0].xy ) * overbright;
  8. }


und der rendervorgang sieht nun auch bissel anderst aus *g*

Code:
  1.  
  2.         // Enable client vertex array
  3.         glEnableClientState(GL_VERTEX_ARRAY);
  4.         glEnableClientState(GL_NORMAL_ARRAY);
  5.         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  6.  
  7.         // Draw array elements for shaders
  8.         int apos;
  9.         for (int i = 0; i < numsurfaces; i++)
  10.         {
  11.             // Bind VBO
  12.             glBindBuffer(GL_ARRAY_BUFFER_ARB, surfaces[i].vboid);
  13.  
  14.             // Bind simple shader
  15.             gSimpleShaderPrg->Bind();
  16.             gSimpleShaderPrg->SetUniform1f("overbright", gRenderData->testshaderoverbright);
  17.  
  18.             // Enables vertex attributes for tangent and binormal
  19.             glEnableVertexAttribArrayARB(gSimpleShaderPrg->GetTangentAttribPos());
  20.             glEnableVertexAttribArrayARB(gSimpleShaderPrg->GetBiNormalAttribPos());
  21.  
  22.              // Bind VBO
  23.             glBindBuffer(GL_ARRAY_BUFFER_ARB, surfaces[i].vboid);
  24.  
  25.             // Setup vertex pointers
  26.             glVertexPointer(3,GL_FLOAT,sizeof(sR3DVertex),0);
  27.             glNormalPointer(GL_FLOAT,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 1));
  28.             glTexCoordPointer(2,GL_FLOAT,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 4));
  29.  
  30.             // Passing tangent and binormal the attributes
  31.             glVertexAttribPointerARB(gSimpleShaderPrg->GetTangentAttribPos(), 3,GL_FLOAT,0,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 2));
  32.             glVertexAttribPointerARB(gSimpleShaderPrg->GetBiNormalAttribPos(),3,GL_FLOAT,0,sizeof(sR3DVertex),(void*)(sizeof(sR3DVector3) * 3));
  33.  
  34.             if (surfaces[i].shader) surfaces[i].shader->Bind();
  35.             gRenderMng->DrawArrays(0, surfaces[i].numindices, true);
  36.             if (surfaces[i].shader) surfaces[i].shader->Unbind();
  37.  
  38.             // Disables vertex attributes for tangent and binormal
  39.             glDisableVertexAttribArrayARB(gSimpleShaderPrg->GetTangentAttribPos());
  40.             glDisableVertexAttribArrayARB(gSimpleShaderPrg->GetBiNormalAttribPos());
  41.  
  42.             // Unbind simple shader
  43.             gSimpleShaderPrg->Unbind();
  44.  
  45.             // Unbind VBO
  46.             glBindBuffer(GL_ARRAY_BUFFER_ARB,0);
  47.         }
  48.  
  49.         // Disable client vertex array
  50.         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  51.         glDisableClientState(GL_NORMAL_ARRAY);
  52.         glDisableClientState(GL_VERTEX_ARRAY);
  53.  


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 » 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.012s | 17 Queries | GZIP : On ]