DGL
https://delphigl.com/forum/

Orange Book Holz Shader klappt nicht
https://delphigl.com/forum/viewtopic.php?f=20&t=5099
Seite 1 von 1

Autor:  Najo [ Fr Jan 20, 2006 16:23 ]
Betreff des Beitrags:  Orange Book Holz Shader klappt nicht

Hi,

ich habe gerade versucht den Holz Shader vom Orange Book (s. http://www.3dshader.com) zum laufen zu bringen. Das Kompelieren und Anhängen klappt ohne Fehlermeldungen, jedoch bleibt mein Bildschirm absolut schwarz. Was muß ich von seiten meines Hauptprogramms einstellen, damit es klappt? Bis jetzt habe ich eine 3D, 64*64*64 Textur erstellt, per glBindTexture an GL_TEXTURE_3D gebunden und per glEnable(GL_TEXTURE_3D) aktiviert. Desweiteren verwende ich folgende Belegungen für die Shadervariablen:
Code:
  1.  
  2. float lightPos[3]    = {0.0f, 0.0f, 2.0f};
  3. float darkwood[3] = {0.4f, 0.2f, 0.07f};
  4. float lightwood[3]  = {0.6f, 0.3f, 0.1f};
  5. float scale            = 2.0f;
  6. float ringfre          = 4.0f;
  7. float lightgrains     = 1.0f;
  8. float darkgrains     = 0.0f;
  9. float grainthreshold = 0.5f;
  10. float noisescale[3]  = {0.5f, 0.1f, 0.1f};
  11. float noisiness        = 3.0;
  12. float grainscale      = 27.0;
  13.  

Meine 3D Textur ist eine RGB Textur bestehend aus unsigned byte. Weiß jemand was ich verkehrt mache?

Viele Grüße,
Najo

Autor:  Grizzly [ Fr Jan 20, 2006 18:03 ]
Betreff des Beitrags: 

schwarz? wenn der shader aus irgend nem grund nicht wirkt, sollte eigentlich es zumindest so aussehen, als würde er garnicht da sein. Ansonsten, hast du den shader gebunden? Und im weiteren, könntest du etwas genauere Infos geben, was du amchst, dass kann ich deiner beschreibung nicht so ganz entnehmen (bevorzugt mit source-Auszügen, wo es zählt)

Autor:  Najo [ Fr Jan 20, 2006 18:46 ]
Betreff des Beitrags: 

Hi,

ich versuche gerade mir die Shader beizubringen. Dafür render ich einfach ein Quad und wollte darauf den Holz Shader loslassen. Hier die zwei Shader von der oben genannten Quelle:
Vertex Shader
Code:
  1.  
  2. varying float LightIntensity;
  3. varying vec3  MCposition;
  4.  
  5. uniform vec3  LightPos;
  6. uniform float Scale;
  7.  
  8. void main(void)
  9. {
  10.     vec3 ECposition = vec3 (gl_ModelViewMatrix * gl_Vertex);
  11.     MCposition      = vec3 (gl_Vertex) * Scale;
  12.     vec3 tnorm      = normalize(vec3 (gl_NormalMatrix * gl_Normal));
  13.     LightIntensity  = dot(normalize(LightPos - ECposition), tnorm);
  14.     LightIntensity *= 1.5;
  15.     gl_Position     = ftransform();
  16. }
  17.  

und hier der Fragment Shader:
Code:
  1.  
  2. varying float LightIntensity;
  3. varying vec3  MCposition;
  4.  
  5. uniform sampler3D Noise;
  6.  
  7. uniform vec3  LightWoodColor;
  8. uniform vec3  DarkWoodColor;
  9. uniform float RingFreq;
  10. uniform float LightGrains;
  11. uniform float DarkGrains;
  12. uniform float GrainThreshold;
  13. uniform vec3  NoiseScale;
  14. uniform float Noisiness;
  15. uniform float GrainScale;
  16.  
  17. void main(void)
  18. {
  19.     vec3 noisevec = vec3 (texture3D(Noise, MCposition * NoiseScale) *
  20.                                                  Noisiness);
  21.     vec3 location = MCposition + noisevec;
  22.  
  23.     float dist = sqrt(location.x * location.x + location.z * location.z);
  24.     dist *= RingFreq;
  25.  
  26.     float r = fract(dist + noisevec[0] + noisevec[1] + noisevec[2]) * 2.0;
  27.  
  28.     if (r > 1.0)
  29.         r = 2.0 - r;
  30.  
  31.     vec3 color = mix(LightWoodColor, DarkWoodColor, r);
  32.  
  33.     r = fract((MCposition.x + MCposition.z) * GrainScale + 0.5);
  34.     noisevec[2] *= r;
  35.     if (r < GrainThreshold)
  36.         color += LightWoodColor * LightGrains * noisevec[2];
  37.     else
  38.         color -= LightWoodColor * DarkGrains * noisevec[2];
  39.  
  40.     color *= LightIntensity;
  41.    
  42.     gl_FragColor = vec4 (color, 1.0);
  43. }
  44.  

Zu Beginn generiere ich mir die 3D Noise Textur durch einfache Zufallszahlen, danach mach ich sie OpenGL bekannt durch
Code:
  1.  
  2. glGenTextures(1, &textures[TEX_3DNOISE]);  
  3. glBindTexture(GL_TEXTURE_3D, textures[TEX_3DNOISE]);
  4. glTexImage3D(GL_TEXTURE_3D, 0, 3, _hwl, _hwl, _hwl, 0, GL_RGB, GL_UNSIGNED_BYTE, texdata);
  5. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  6. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  7.  

Danach initialisiere ich Slang mit dem folgenden Quellcode:
Code:
  1.  
  2. sl_po=glCreateProgramObjectARB();
  3. sl_vs=glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  4. sl_fs=glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  5.    
  6. char *fn1=0;
  7. char *fn2=0;
  8.  
  9. readfromfile("Shader/wood.vert", &fn1);
  10. glShaderSourceARB(sl_vs, 1, (const char**)&fn1, 0);
  11.    
  12. readfromfile("Shader/wood.frag", &fn2);
  13. glShaderSourceARB(sl_fs, 1, (const char**)&fn2, 0);
  14.    
  15. glCompileShaderARB(sl_vs);
  16. slang_error(sl_vs);
  17.  
  18. glCompileShaderARB(sl_fs);
  19. slang_error(sl_fs);
  20.  
  21. glAttachObjectARB(sl_po, sl_vs);
  22. glAttachObjectARB(sl_po, sl_fs);
  23.  
  24. glDeleteObjectARB(sl_vs);
  25. glDeleteObjectARB(sl_fs);
  26.  
  27. glLinkProgramARB(sl_po);
  28. slang_error(sl_po);
  29.  
  30. glUseProgramObjectARB(sl_po);
  31.  

Danach setze ich die Variablen im Shader Programm:
Code:
  1.  
  2. float lightPos[3]    = {0.0f, 0.0f, 2.0f};
  3. float darkwood[3]    = {0.4f, 0.2f, 0.07f};
  4. float lightwood[3]   = {0.6f, 0.3f, 0.1f};
  5. float scale          = 2.0f;
  6. float ringfreq       = 4.0f;
  7. float lightgrains    = 1.0f;
  8. float darkgrains     = 0.0f;
  9. float grainthreshold = 0.5f;
  10. float noisescale[3]  = {0.5f, 0.1f, 0.1f};
  11. float noisiness      = 3.0;
  12. float grainscale     = 27.0;
  13.  
  14. glUniform1iARB(glGetUniformLocationARB(sl_po, "Noise"), 0);
  15. glUniform1fvARB(glGetUniformLocationARB(sl_po, "Scale"), 1, &scale);
  16. glUniform3fvARB(glGetUniformLocationARB(sl_po, "LightPos"), 3, &lightPos[0]);
  17. glUniform3fvARB(glGetUniformLocationARB(sl_po, "DarkWoodColor"), 3, &darkwood[0]);
  18. glUniform3fvARB(glGetUniformLocationARB(sl_po, "LightWoodColor"), 3, &lightwood[0]);
  19. glUniform1fvARB(glGetUniformLocationARB(sl_po, "RingFreq"), 1, &ringfreq);
  20. glUniform1fvARB(glGetUniformLocationARB(sl_po, "LightGrains"), 1, &lightgrains);
  21. glUniform1fvARB(glGetUniformLocationARB(sl_po, "DarkGrains"), 1, &darkgrains);
  22. glUniform1fvARB(glGetUniformLocationARB(sl_po, "GrainThreshold"), 1, &grainthreshold);
  23. glUniform3fvARB(glGetUniformLocationARB(sl_po, "NoiseScale"), 3, &noisescale[0]);
  24. glUniform1fvARB(glGetUniformLocationARB(sl_po, "Noisiness"), 1, &noisiness);
  25. glUniform1fvARB(glGetUniformLocationARB(sl_po, "GrainScale"), 1, &grainscale);
  26.  

Das Rendern ansich ist nicht weiter spektakulär:
Code:
  1.  
  2. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  3.    
  4. glTranslatef(0.0f, 0.0f, -20.0f);
  5.    
  6. glColor3f(0.0f, 0.0f, 1.0f);
  7. glBegin(GL_QUADS);
  8.     glVertex3f(-1.0f, -1.0f, 0.0f);
  9.     glVertex3f( 1.0f, -1.0f, 0.0f);
  10.     glVertex3f( 1.0f,  1.0f, 0.0f);
  11.     glVertex3f(-1.0f,  1.0f, 0.0f);
  12. glEnd();
  13. glutSwapBuffers();
  14.  


Die Shader-Initialisierung läuft ohne Fehler durch, nur der Bildschirm bleibt leider schwarz, so dass ich dachte, dass es vielleicht an den übergebenen Shader-Parameter liegt oder dass ich die 3d Textur noch irgendwie dem Shader bekannt machen muß.

Viele Dank,
Najo

Autor:  Speedmaster [ Mo Jan 30, 2006 16:18 ]
Betreff des Beitrags: 

Was für eine Grafikkarte hast du?
OpenGL nach Fehlern gefragt?

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