DGL
https://delphigl.com/forum/

Problem mit Shaderbenutzung
https://delphigl.com/forum/viewtopic.php?f=20&t=6098
Seite 1 von 1

Autor:  Deathball [ Sa Nov 04, 2006 18:51 ]
Betreff des Beitrags:  Problem mit Shaderbenutzung

Hi.

Ich hab mir mal ein paar weitere Beispiele für Shader rausgesucht. Unter anderem bin ich bei diesem Beispiel hier gelandet:
Vertexshader:
Code:
  1.  
  2. //
  3. // Authors: Dave Baldwin, Steve Koren, Randi Rost
  4. //          based on a shader by Darwyn Peachey
  5. //
  6. // Copyright (c) 2002-2006 3Dlabs Inc. Ltd.
  7. //
  8. // See 3Dlabs-License.txt for license information
  9. //
  10.  
  11. uniform vec3 LightPosition;
  12.  
  13. const float SpecularContribution = 0.3;
  14. const float DiffuseContribution  = 1.0 - SpecularContribution;
  15.  
  16. varying float LightIntensity;
  17. varying vec2  MCposition;
  18.  
  19. void main(void)
  20. {
  21.     vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
  22.     vec3 tnorm      = normalize(gl_NormalMatrix * gl_Normal);
  23.     vec3 lightVec   = normalize(LightPosition - ecPosition);
  24.     vec3 reflectVec = reflect(-lightVec, tnorm);
  25.     vec3 viewVec    = normalize(-ecPosition);
  26.     float diffuse   = max(dot(lightVec, tnorm), 0.0);
  27.     float spec      = 0.0;
  28.  
  29.     if (diffuse > 0.0)
  30.     {
  31.         spec = max(dot(reflectVec, viewVec), 0.0);
  32.         spec = pow(spec, 16.0);
  33.     }
  34.  
  35.     LightIntensity  = DiffuseContribution * diffuse +
  36.                       SpecularContribution * spec;
  37.  
  38.     MCposition      = gl_Vertex.xy;
  39.     gl_Position     = ftransform();
  40. }
  41.  


Fragmentshader:
Code:
  1.  
  2. //
  3. // Fragment shader for procedural bricks
  4. //
  5. // Authors: Dave Baldwin, Steve Koren, Randi Rost
  6. //          based on a shader by Darwyn Peachey
  7. //
  8. // Copyright (c) 2002-2006 3Dlabs Inc. Ltd.
  9. //
  10. // See 3Dlabs-License.txt for license information
  11. //
  12.  
  13. uniform vec3  BrickColor, MortarColor;
  14. uniform vec2  BrickSize;
  15. uniform vec2  BrickPct;
  16.  
  17. varying vec2  MCposition;
  18. varying float LightIntensity;
  19.  
  20. void main(void)
  21. {
  22.     vec3  color;
  23.     vec2  position, useBrick;
  24.    
  25.     position = MCposition / BrickSize;
  26.  
  27.     if (fract(position.y * 0.5) > 0.5)
  28.         position.x += 0.5;
  29.  
  30.     position = fract(position);
  31.  
  32.     useBrick = step(position, BrickPct);
  33.  
  34.     color  = mix(MortarColor, BrickColor, useBrick.x * useBrick.y);
  35.     color *= LightIntensity;
  36.     gl_FragColor = vec4 (color, 1.0);
  37. }
  38.  



Wie in den Shadern ja schon drin steht sollen sie was prozedural mit Ziegelsteinen "einfärben".
So, und jetzt kommt mein Problem - wenn ich das ProgramObject so benutze wie in den Tutorials hier im Wiki, also:
Code:
  1.  
  2.  
  3.  glTranslatef(0, 0, -10);
  4.  //Parameterübergabe und Hintergrund zeichnen:
  5.  //[...]
  6.  //[...]
  7.  
  8.  //Programobjekt aktivieren und Quadrat zeichnen auf das es wirken soll:
  9.  glUseProgramObjectARB(ProgramObject);
  10.  
  11.  glBegin(GL_QUADS);
  12.   glVertex3f(-1, -1, 1);
  13.   glVertex3f(1, -1, 1);
  14.   glVertex3f(1, 1, 1);
  15.   glVertex3f(-1, 1, 1);
  16.  glEnd;
  17.  
  18.  glUseProgramObjectARB(0);
  19.  
  20.  
  21.  
  22.  SwapBuffers(DC);
  23.  


Seh ich nur ein schwarzes Quadrat \":?\"

bei
Code:
  1.  
  2.  
  3.  glTranslatef(0, 0, -10);
  4.  //Parameterübergabe und Hintergrund zeichnen:
  5.  //[...]
  6.  //[...]
  7.  
  8.  //Programobjekt aktivieren und Quadrat zeichnen auf das es wirken soll:
  9.  glUseProgramObjectARB(ProgramObject);
  10.  
  11.  glBegin(GL_QUADS);
  12.   glVertex3f(-1, -1, 1);
  13.   glVertex3f(1, -1, 1);
  14.   glVertex3f(1, 1, 1);
  15.   glVertex3f(-1, 1, 1);
  16.  glEnd;
  17.  
  18.  
  19.  SwapBuffers(DC);
  20.  


wird hingegen alles in Ziegelsteinen gezeichnet (auch der Hintergrund)...

Tja und jetzt wüsste ich gerne woran das liegt und wie ich das beheben kann...


cya,
Deathball

Autor:  PhoenixGL [ Mo Nov 06, 2006 15:44 ]
Betreff des Beitrags: 

Der Shader kommt mir ja bekannt vor.
Hab ich auch schonmal (ab-)geschrieben.
Und bei mir hatts reibungslos gefunzt, aber wenn ich mich recht erinnere hatte ich das glUseProgramObjectARB(...) nur einmal in der init ausgeführt.
Könnte es vieleicht sei das man die uniform-variablen nach der glUseProgramObjectARB(...) übergeben muss?

Autor:  Deathball [ Mo Nov 06, 2006 16:34 ]
Betreff des Beitrags: 

Code:
  1.  
  2.  //Hintergrund zeichnen
  3.  //[...]
  4.  
  5.  glUseProgramObjectARB(ProgramObject);
  6.  
  7.  //Parameterübergabe
  8.  //[...]
  9.  
  10.  glBegin(GL_QUADS);
  11.   glVertex3f(-1, -1, 1);
  12.   glVertex3f(1, -1, 1);
  13.   glVertex3f(1, 1, 1);
  14.   glVertex3f(-1, 1, 1);
  15.  glEnd;
  16.  
  17.  glUseProgramObjectARB(0);
  18.  


funzt perfekt - thx für die Hilfe...

cya,
Deathball

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/