DGL https://delphigl.com/forum/ |
|
Bumpmapping https://delphigl.com/forum/viewtopic.php?f=20&t=9325 |
Seite 1 von 2 |
Autor: | Pk3 [ Fr Jul 09, 2010 19:50 ] |
Betreff des Beitrags: | Bumpmapping |
Hi, ich habe den Bumpmapshader aus euerer Shadersammlung in meinem Programm angewendet und musste feststellen, das dieser nicht richtig läuft. Grund dafür müsste das Multitextureing sein. Hier der Code zum Rendern: Code: // Texture glActiveTexture(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, Render.Image[textureId].tex); // Normal-Map-Texture glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, Render.Image[MaterialSystem.Material[materialId].normtextureId].tex); // ... (Normalen sind richtig gesetzt) Dateianhang: Was mache ich falsch? Mfg, Pk3 ![]() |
Autor: | Pk3 [ Sa Jul 10, 2010 12:26 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Habs jetzt einigermaßen hinbekommen, aber das Licht wird nur im 180° - Winkel dargestellt. Je nach dem von welcher Seite ich auf das Licht schaue scheint es in meine Richtung. Am Vertex- und Fragmentshader habe ich kleine Änderungen gemacht: Fragment-Shader: Code: const float PI = 3.14159265; //Pi, zur Berechnung der Rotation const int LIGHT_COUNT = 1; //Anzahl der berücksichtigten Lichter varying vec3 N; //NormalenVektor varying vec3 V; //VertexVektor varying vec3 lightvec[LIGHT_COUNT]; //LichtVektor(en) uniform sampler2D Texture0; //normale Textur uniform sampler2D Texture1; //NormalMap vec3 rotate(vec3 a, vec3 p, float rad) { vec3 p1 = cos(rad) * p + sin(rad) * cross(a, p); return p1; } void main(void) { vec2 TexCoord = vec2(gl_TexCoord[0]); vec3 G = normalize(vec3(dFdx(TexCoord.s), dFdy(TexCoord.t), 0.0)); vec3 B = normalize(rotate(N, cross(N, G), -0.25*PI)); vec3 T = normalize(cross(B, N)); mat3 M = mat3(T, B, N); vec3 normal = normalize((vec3(texture2D(Texture0, TexCoord)) - vec3(0.5, 0.5, 0.5)) * M); normal = gl_NormalMatrix * normal; vec3 Eye = normalize(-V); vec4 EndColor = vec4(0.0, 0.0, 0.0, 1.0); for(int i = 0; i < LIGHT_COUNT; i++) { vec3 Reflected = normalize(reflect(-lightvec[i], normal)); vec4 IAmbient = gl_LightSource[i].ambient * gl_FrontMaterial.ambient; vec4 IDiffuse = gl_LightSource[i].diffuse * max(dot(normal, lightvec[i]), 0.0) * gl_FrontMaterial.diffuse; vec4 ISpecular = gl_LightSource[i].specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess) * gl_FrontMaterial.specular; EndColor += (IAmbient+IDiffuse+ISpecular); } gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor); gl_FragColor.w = 1.0; } Vertex-Shader: Code: const int LIGHT_COUNT = 1; //Anzahl der berücksichtigten Lichter varying vec3 N; //NormalenVektor varying vec3 V; //VertexVektor varying vec3 lightvec[LIGHT_COUNT]; //LichtVektor(en) void main(void) { gl_TexCoord[0] = gl_MultiTexCoord0; N = normalize(gl_Normal); V = vec3(gl_ModelViewMatrix * gl_Vertex); for(int i = 0; i < LIGHT_COUNT; i++){ lightvec[i] = normalize(gl_LightSource[i].position.xyz - V); } gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; } Momentan verwende ich nur eine Textur (Normalmap). Screenshot: Dateianhang: Hab auch schon hier im Forum gesucht und etwas gefunden, jedoch funktioniert das überhaupt nicht, weil das Licht sich dann bewegt und komische Muster entstehen.... |
Autor: | Bergmann89 [ Sa Jul 10, 2010 14:59 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Hey, der Beitrag von mir, den du gepostest hast is aus dem alten Tutorial, das is nich mehr aktuell. Aus diesem Grund hab ich ja dann mit der Hilfe der anderen auch den Shader geschrieben. Mit den Texturen hatte ich kein Problem. hier ma mein RenderCode: Code: glColor4f(1,1,1,1); glActiveTexture(GL_TEXTURE0); Tex.Bind; glActiveTexture(GL_TEXTURE1); NormalMap.Bind; Light1.Bind(GL_LIGHT0); Material.Bind; Shader.Bind; glBegin(GL_QUADS); glNormal3f(0,0,1); glTexCoord2f(0,1); glVertex3f(-2,-2, 0); glTexCoord2f(1,1); glVertex3f( 2,-2, 0); glTexCoord2f(1,0); glVertex3f( 2, 2, 0); glTexCoord2f(0,0); glVertex3f(-2, 2, 0); glEnd; Shader.Unbind; glActiveTexture(GL_TEXTURE0); Tex.Unbind; glActiveTexture(GL_TEXTURE1); NormalMap.Unbind; glDisable(GL_LIGHTING); Hast du dem Shader auch mitgeteilt, welche Texturen du benutzen willst? Code: Shader.Bind; Shader.SetParam1i('Texture0', 0); Shader.SetParam1i('Texture1', 1); Shader.Unbind; €: wie meinst du das mit den 180°? bei mir funzt er 1a... MfG Bergmann |
Autor: | Pk3 [ Sa Jul 10, 2010 15:21 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Das mit den Texturen hab ich jetzt hinbekommen mittels glUniform1i. Einziges Problem ist das mit dem 180° - Winkel. Ich hab in meinem letzten Beitrag ein Screenshot angehängt wo das zu sehen ist ![]() |
Autor: | Coolcat [ Sa Jul 10, 2010 15:32 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Dein Screenshot ist für außen stehende wenig hilfreich, da wohl niemand außer dir weiß wie das den korrekt aus sehen sollte. Z.B. die Normalmap wäre hilfreich. Zitat: Einziges Problem ist das mit dem 180° - Winkel Wie genau ist das gemeint? Bei einem 180-Winkel sollte es doch reichen die Normale bzw. den Vektor zur Lichtquelle zu invertieren? |
Autor: | Pk3 [ Sa Jul 10, 2010 15:39 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Das gesamte Licht ist nur in einem 180° - Winkel zu sehen. Mal scheint das Diffuse - Licht auf die eine, dann auf die andere Seite, je nach dem wie die Kameraposition ist. Das Specular - Licht jedoch ist immer auf der selben Seite. Auf dem Screenshot oben sieht mans net so gut, aber oben sieht man, das es auf der Seite dunkel ist. Normal-Map: http://xyross.de/file.php?id=59 Edit: Ich verwende Punktlich, aber der Shader stellt das Licht als Direktionslicht ein |
Autor: | Bergmann89 [ Sa Jul 10, 2010 17:56 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Hey, also meinst du die Hinterseide vom Quad? Das geht nich anders glaube ich. Da musste einfach noch n 2. Quad drauf zeichnen un dann dementsprechend den Normalenvektor neu setzten. €: ne der Shader berechnet das Licht in Abhängigkeit der Lichtposition. MfG Bergmann p.s.: der Download der Normalmap geht nich. |
Autor: | Pk3 [ Sa Jul 10, 2010 18:09 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Nene, hier ist ein besseres Bild, das zeigen soll was ich meine ![]() http://xyross.de/file.php?id=60 Auf der linken Seite ist es dunkel, aber es soll ja ein Punktlicht sein... |
Autor: | Bergmann89 [ Sa Jul 10, 2010 20:41 ] |
Betreff des Beitrags: | Re: Bumpmapping |
hey, sieht in der Tat komisch aus. Kannst du die Exe ma hochalden? Würd mir das gern ma in Echtzeit angucken. Sicher das die Normalen alle stimmen? Ändert sich die dunkle Stelle wenn du das Licht um das Objekt drehst? Ich denke nicht das es was mit Punktlichtern oder Direktionslicht zu tun hat. Denn der Shader arbeitet auf alle Fälle mit Punktlicht, weil ja die Daten des Lichts verrechnet werden. Wäre es direktionslicht würde man ja nur den Vektor übergeben. Ich hab auch ma irgendwo was von ner maximalen Leuchtweite von Licht gelesen, danach sieht es mir nämlich eher aus. Ich weiß aber nich mehr genau was in dem Artikel stand. €: hast du's schonma mit nem normalen Per-Pixel-Beleuchtungs-Shader versucht? Wenn es da genau so aussieht muss es was anderes sein... MfG Bergmann |
Autor: | Pk3 [ Sa Jul 10, 2010 21:29 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Zitat: Kannst du die Exe ma hochalden? Jo kannsts hier runterladen: http://xyross.de/file.php?id=62 Mit den Pfeiltasten und mit Bild hoch/runter kannste das Licht positionieren. Mit W,A,S,D kann man rumfliegen. Zitat: hast du's schonma mit nem normalen Per-Pixel-Beleuchtungs-Shader versucht? Wenn es da genau so aussieht muss es was anderes sein... Das Punktlicht funktioniert problemlos ![]() |
Autor: | Bergmann89 [ So Jul 11, 2010 00:48 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Sehr seltsam ![]() €: Ok, bei mir kommt der Fehler auch, allerdings nur, wenn die Ebene in der XZ-Ebene liegt, wenn ich das ganze in die XY-Egbene verschiebe, geht alles 1a -.- €2: ich weiß jetzt, das es iwie an der Berechnung von G scheitert, ich komm aber beim besten Willen nicht weiter. Da mein Quad in der XY-Ebene gelegen hat, hat die Ableitung von X und Y funktioniert. Eine Ableitung von Z gibts es aber nicht. Dann hab ich versucht die Ableitungen einfach zu vertauchen, das geht aber auch nicht. Wir brauchen jetzt ne Idee, wie man G (oder gleich B) anders berechnen kann. |
Autor: | Pk3 [ So Jul 11, 2010 09:25 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Ah stimmt, bei dem Shader geht das ja nur bei Wänden, also X und Y. Moeglich muss es aber irgentwie sein oder? Ich hab einen anderen Shader gefunden der zu funktionieren scheint: http://xyross.de/file.php?id=63 (Dateien ersetzen) Ich bin mir nicht sicher aber es scheint so als ob der Shader den "Schatten" in genau die falsche Richtung schlägt. |
Autor: | Bergmann89 [ So Jul 11, 2010 15:45 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Hey, jetzt schmiert die exe mit ner Zugriffsverletzung ab ^^ Bei dem Shader musst du aber die Tangente als Attribut übergeben, oder? Der Stand glaube auch mit in dem alten Topic von mit. Der war von Sellmann wenn ich mich nich täusche. Aber da soll auch irgend ein Fehler drin gewesen sein (siehe hier). MfG Bergmann. |
Autor: | damadmax [ Mo Jul 12, 2010 08:31 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Habe das auch mal mittels dfdx/y versucht. Bin dann nach mehrfachem Scheitern auf diesen Artikel gestossen. Leider auch ohne Erfolg. Vielleicht schaffst du es. Schliesslich habe ich den Color Wert missbraucht und dort die vorausberechnete Tangente gespeichert. Erspart die Attribute und Farbe pro Vertex brauche ich so gut wie nie. |
Autor: | Bergmann89 [ Mo Jul 12, 2010 10:05 ] |
Betreff des Beitrags: | Re: Bumpmapping |
Hey, das sieht vielversprechend aus, ich versuch mich später ma dran, erstma muss ich zur Prüfung -.- Wünscht mir Glück ![]() MfG Bergmann |
Seite 1 von 2 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |