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

Aktuelle Zeit: Sa Aug 16, 2025 13:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Orange Book Holz Shader klappt nicht
BeitragVerfasst: Fr Jan 20, 2006 16:23 
Offline
DGL Member

Registriert: Mi Jan 18, 2006 21:00
Beiträge: 9
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 18:03 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 18:46 
Offline
DGL Member

Registriert: Mi Jan 18, 2006 21:00
Beiträge: 9
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 30, 2006 16:18 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Was für eine Grafikkarte hast du?
OpenGL nach Fehlern gefragt?

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 23 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.067s | 16 Queries | GZIP : On ]