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

Aktuelle Zeit: So Jul 20, 2025 01:38

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Bumpmaping
BeitragVerfasst: Mi Dez 16, 2009 13:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Warum verfolgst du nich mal den Ansatz mit dem Gradient, wenn du immer noch danach suchst? Normalerweiße sollte das so gehen:
Code:
  1. vec3 g = normalize(vec3(dFdx(), dFdy(), 0.0));   //den Gradient aus der Ableitung berechnen
  2. vec3 N = normalize(gl_NormalMatrix * gl_Normal); //Normale berechnen
  3. vec3 B = normalize(cross(N, g));                 //BiTangente auf N und g aufstellen
  4. vec3 T = normalize(cross(B, N));                 //Tangente auf BiTangente und Normale aufstellen
Das gute is jetzt, das ich mir die Drehung um die 90° von denen ich oben gesprochen hab sparen kann, weil ich die BiTangente ja eh brauch (wusste ich vorhin nich). Ich werd das mal so umsetzten, mir fehlt aber auch noch der ganze Rest, also wenn das ma schnell jmd bei sich im (fast) fertigen Shader testen kann wäre toll...

€: Hab jetzt den Per-Pixel-Shader soweit fertig, das ich mich an die Berechnung der Vectoren machen kann, aber irgendwie komm ich mit dFdx() un dFdy() nich klar, wie benutz ich die richtig?

€2: habs hin bekommen, siht eig richtig aus, oder?
Code:
  1. //Vertex
  2. const int LightCount = 1;
  3. varying vec3 N;
  4. varying vec3 v;
  5. varying vec3 lightvec[LightCount];
  6. void main(void)
  7. {
  8.     gl_TexCoord[0] = gl_MultiTexCoord0;
  9.     N              = normalize(gl_NormalMatrix * gl_Normal);
  10.     v              = vec3(gl_ModelViewMatrix * gl_Vertex);
  11.     for(int i = 0; i < LightCount; i++){
  12.         lightvec[i] = normalize(gl_LightSource[i].position.xyz - v);
  13.     }
  14.     gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  15. }
  16. //end
  17.  
  18. //Fragment
  19. const int LightCount = 1;
  20. varying vec3 N;
  21. varying vec3 v;
  22. varying vec3 lightvec[LightCount];
  23. uniform sampler2D Texture0;
  24. uniform sampler2D Texture1;
  25. void main(void)
  26. {  
  27.     vec2 TexCoord = vec2(gl_TexCoord[0]);
  28.     vec3 g = normalize(vec3(dFdx(TexCoord.s), dFdy(TexCoord.t), 0.0));   //den Gradient aus der Ableitung berechnen
  29.     vec3 B = normalize(cross(N, g));                 //BiTangente auf N und g aufstellen
  30.     vec3 T = normalize(cross(B, N));                 //Tangente auf BiTangente und Normale aufstellen
  31.     mat3 M = mat3(T, B, N);
  32.  
  33.     vec3 normal = normalize(vec3(texture2D(Texture1, TexCoord)) + vec3(-0.5, -0.5, -0.5));
  34.     normal *= M;
  35.    
  36.     vec3 Eye = normalize(-v);
  37.     vec4 EndColor = vec4(0.0, 0.0, 0.0, 0.0);
  38.     for(int i = 0; i < LightCount; i++){
  39.         vec3 Reflected = normalize( reflect(-lightvec[i], normal));
  40.         vec4 IAmbient  = gl_LightSource[i].ambient  * gl_FrontMaterial.ambient;
  41.         vec4 IDiffuse  = gl_LightSource[i].diffuse  * gl_FrontMaterial.diffuse  * max(dot(normal, lightvec[i]), 0.0);
  42.         vec4 ISpecular =                              gl_FrontMaterial.specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess);
  43.         EndColor += (IAmbient+IDiffuse+ISpecular);
  44.     }
  45.     EndColor += gl_FrontMaterial.emission;
  46.    
  47.     gl_FragColor = min((gl_FrontLightModelProduct.sceneColor+
  48.                        EndColor)*
  49.                        texture2D(Texture0, TexCoord),
  50.                        vec4(1.0, 1.0, 1.0, 1.0));        
  51. }
  52. //end


Download Bumpmap Demo (neue Demo im Post unten)
hab vergessen die TXT mit rein zu packen un will mein Modem jetz nich nochma quälen: TXT im anhang...

Als nächstes werd ich ma probieren ob es was bringt, wenn ich die Matrix gleich mit übergeb, slt kann man ja noch paar FPS raus holen...

€3: @Coolcat: du hattest recht, das ganze muss noch 45° um die Normale gedreht werden, dazu hab ich DAS gefunden. Ich kann mich aber grad nich mehr so gut an die VectorRechnung erinnern^^ Kann mir da jmd auf die Sprünge helfen?
Kann mir die Formel unten vlt jmd in Worten aufschreiben, oder gleich als Quelltext? Thx

MfG Bergmann


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Zuletzt geändert von Bergmann89 am Do Dez 17, 2009 11:19, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Bumpmaping
BeitragVerfasst: Do Dez 17, 2009 11:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

hab nochma paar Sachen überarbeitet. So sieht der Shader jetzt aus:
Code:
  1. //Vertex
  2. const int LIGHT_COUNT = 1;
  3. varying vec3 N;
  4. varying vec3 v;
  5. varying vec3 lightvec[LIGHT_COUNT];
  6. void main(void)
  7. {
  8.     gl_TexCoord[0] = gl_MultiTexCoord0;
  9.     N              = normalize(gl_NormalMatrix * gl_Normal);
  10.     v              = vec3(gl_ModelViewMatrix * gl_Vertex);
  11.     for(int i = 0; i < LIGHT_COUNT; i++){
  12.         lightvec[i] = normalize(gl_LightSource[i].position.xyz - v);
  13.     }
  14.     gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  15. }
  16. //end
  17.  
  18. //Fragment
  19. const int LIGHT_COUNT = 1;
  20. const float PI = 3.14159265;
  21. varying vec3 N;
  22. varying vec3 v;
  23. varying vec3 lightvec[LIGHT_COUNT];
  24. uniform sampler2D Texture0;
  25. uniform sampler2D Texture1;
  26.  
  27. vec3 rotate(vec3 a, vec3 p, float rad){
  28.     vec3 p1 = cos(rad) * p +
  29.               sin(rad) * cross(a, p);
  30.     return p1;
  31. }
  32.  
  33. void main(void){   
  34.     vec2 TexCoord = vec2(gl_TexCoord[0]);
  35.     vec3 g = normalize(vec3(dFdx(TexCoord.s), dFdy(TexCoord.t), 0.0));   //den Gradient aus der Ableitung berechnen
  36.     vec3 B = normalize(cross(N, g));                 //BiTangente auf N und g aufstellen
  37.     B = normalize(rotate(N, B, -0.25*PI));           //um 45° drehen damit richtig
  38.     vec3 T = normalize(cross(B, N));                 //Tangente auf BiTangente und Normale aufstellen
  39.     mat3 M = mat3(T, B, N);
  40.  
  41.     vec3 normal = normalize(vec3(texture2D(Texture1, TexCoord)) + vec3(-0.5, -0.5, -0.5));
  42.     normal *= M;
  43.    
  44.     vec3 Eye = normalize(rotate(N, -v, 0.5*PI));  
  45.     vec4 EndColor = vec4(0.0, 0.0, 0.0, 0.0);
  46.     for(int i = 0; i < LIGHT_COUNT; i++){
  47.         vec3 Reflected = normalize( reflect(-lightvec[i], normal));
  48.         vec4 IAmbient  = gl_LightSource[i].ambient * gl_FrontMaterial.ambient;
  49.         vec4 IDiffuse  = gl_LightSource[i].diffuse * gl_FrontMaterial.diffuse  * max(dot(normal, lightvec[i]), 0.0);
  50.         vec4 ISpecular =                             gl_FrontMaterial.specular * pow(max(dot(Reflected, Eye),  0.0), gl_FrontMaterial.shininess);
  51.         EndColor += (IAmbient+IDiffuse+ISpecular);
  52.     }
  53.     EndColor += gl_FrontMaterial.emission;
  54.    
  55.     gl_FragColor = min((gl_FrontLightModelProduct.sceneColor+
  56.                        EndColor)*
  57.                        texture2D(Texture0, TexCoord),
  58.                        vec4(1.0, 1.0, 1.0, 1.0));        
  59. }
  60. //end


Hier nochma die neue Demo. Einwas bereitet mir aber noch Kopfzerbrechen. Wenn man das Licht dreht (LMT) funzt alles so wie's soll. Aber wenn man die Kamera dreht (RMT), dann hab ich das gefühl, das sich der Schatten auf dem Objekt verändert, was ja eig. falsch wäre. Was sagt ihr dazu?

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 4 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 19 Queries | GZIP : On ]