Hallöle,
Anschließend an meinen letzten Thread präsentiere ich euch meine Arbeit der letzten Tage. Einen Shader mit dem es möglich ist mehr als nur 8 Lichtquellen zu verwenden.
Außerdem wird das standart Vertexlighting im 3d Modus immer ignoriert wenn man einen Shader auf seine Modelle anwenden will, darum ist dieser Shader auch sinnvoll.
Außerdem wollte ich unbedingt Bumpmapping können darum Hab ich die letzten Tage viel im Netz recharchiert und habe folgendes Tutorial gefunden:
fabiensanglard.net/bumpMapping/index.php
Zusammen mit dem Wissen das ich von Xor's Tutorials habe (kann ich jedem nur empfehlen) habe ich in viel Arbeit und mit leider zu wenigem mathematischem Verständnis diesen Shader "zusammen gebastelt". Teile davon hab ich nur ausm Netz kopert ohne sie ganz zu verstehen und da liegt glaub ich auch der Fehler.
Wie gesagt, das Bumpmapping geht nicht. Das Problem ist glaube ich das ich den Tangentvektor von den Positionsvektor und den Normal Vektor brauche und den nicht korrekt berechne.
Denn wenn ich das ric htig versteh (und davon geh ich nicht aus^^) dann muss man mehere Richtungsverktoren berechnen aber nicht für jedes Vertex sondern für jedes Pixel.
Wer kann mir weiterhelfen?
Der Shader darf frei verwendet werden und es ist auch kein Creditseintrag nötig. Ihr müsst nur ein paar Arrays erstellen und an den Shader übergeben. Wichtig ist, dass ihr die Richtungen für direktionales Licht mit degtorad ind Radians umwandelt. Wenn ihr keine Liochtreflexion braucht, dann lasst einfach das zweite gl_FragColor im Fragmentshader weg.
Vertex Shader:
Alles anzeigen
Fragment Shader:
Alles anzeigen
Anschließend an meinen letzten Thread präsentiere ich euch meine Arbeit der letzten Tage. Einen Shader mit dem es möglich ist mehr als nur 8 Lichtquellen zu verwenden.
Außerdem wird das standart Vertexlighting im 3d Modus immer ignoriert wenn man einen Shader auf seine Modelle anwenden will, darum ist dieser Shader auch sinnvoll.
Außerdem wollte ich unbedingt Bumpmapping können darum Hab ich die letzten Tage viel im Netz recharchiert und habe folgendes Tutorial gefunden:
fabiensanglard.net/bumpMapping/index.php
Zusammen mit dem Wissen das ich von Xor's Tutorials habe (kann ich jedem nur empfehlen) habe ich in viel Arbeit und mit leider zu wenigem mathematischem Verständnis diesen Shader "zusammen gebastelt". Teile davon hab ich nur ausm Netz kopert ohne sie ganz zu verstehen und da liegt glaub ich auch der Fehler.
Wie gesagt, das Bumpmapping geht nicht. Das Problem ist glaube ich das ich den Tangentvektor von den Positionsvektor und den Normal Vektor brauche und den nicht korrekt berechne.
Denn wenn ich das ric htig versteh (und davon geh ich nicht aus^^) dann muss man mehere Richtungsverktoren berechnen aber nicht für jedes Vertex sondern für jedes Pixel.
Wer kann mir weiterhelfen?
Der Shader darf frei verwendet werden und es ist auch kein Creditseintrag nötig. Ihr müsst nur ein paar Arrays erstellen und an den Shader übergeben. Wichtig ist, dass ihr die Richtungen für direktionales Licht mit degtorad ind Radians umwandelt. Wenn ihr keine Liochtreflexion braucht, dann lasst einfach das zweite gl_FragColor im Fragmentshader weg.
Vertex Shader:
GML-Quellcode
- attribute vec3 in_Position; // (x,y,z)
- attribute vec3 in_Normal; // (x,y,z)
- attribute vec4 in_Colour; // (r,g,b,a)
- attribute vec2 in_TextureCoord; // (u,v)
- varying vec2 v_vTexcoord;
- varying vec3 v_vNormal;
- varying vec3 v_vPosition;
- varying vec4 v_vColour;
- varying vec3 v_vLightVec;
- varying vec3 ldir;
- varying vec3 halfVec;
- varying vec3 eyeVec;
- uniform vec3 CamPos;
- uniform float LIGHTS;
- uniform float Lights_Kind[16];
- uniform float Lights_Direction[16];
- uniform float Lights_DirectionZ[16];
- uniform float Lights_Color_R[16];
- uniform float Lights_Color_G[16];
- uniform float Lights_Color_B[16];
- uniform float Lights_X[16];
- uniform float Lights_Y[16];
- uniform float Lights_Z[16];
- uniform float Lights_Range[16];
- uniform vec2 resolution;
- //diese Funktion is für direktionales Licht
- vec3 DoDirLightB(vec3 ws_normal, float dir, float dirz, float R, float G, float B)
- {
- //die Richtung wird mit zwei Radien angegeben
- //und da unten in einen Richtungsvektor umgerechnet
- float vx = cos(dir) * cos(dirz);
- float vy = sin(dir) * cos(dirz);
- float vz = sin(dirz);
- ldir = vec3(vx, vy, vz);
- float dotresult = dot(ws_normal, normalize(ldir)) * 0.5 + 0.5;
- vec3 diffusecolor = vec3(R, G, B);
- //hier wird die Farbe des Vertex an void main übergeben
- return dotresult * diffusecolor;
- }
- //diese Funktion ist für Pointlights (nicht getestet)
- vec3 DoPointLightB(vec3 pos, float posx,float posy,float posz, float range, float R, float G, float B)
- {
- ldir = vec3(posx, posy, posz) - pos;
- float attenuation = max( 1.0 - length(normalize(ldir))/range, 0.0);
- float lighting = (dot( normalize(v_vNormal), normalize(ldir)) * 0.5 + 0.5) * attenuation;
- vec3 diffusecol = vec3(R, G, B);
- return lighting * diffusecol;
- }
- //das ist die hauptfunktion für das Licht
- vec4 DoLightingB(vec4 vertexcolor, vec3 objectspacepos, vec3 objectspacenormal)
- {
- vec4 objectspacenormal4 = vec4(objectspacenormal, 1.0);
- vec3 ws_normal = normalize(objectspacenormal);
- vec3 accumcol = vec3(0.3, 0.3, 0.3);
- //hier werden alle Lichtinformation aus den Arrays gelesen
- //und an die Funktionen oben übergeben
- for(int i = 1; i <= int(LIGHTS); i++) {
- accumcol += abs(min(Lights_Kind[i], 0.0)) * DoDirLightB(ws_normal, Lights_Direction[i], Lights_DirectionZ[i], Lights_Color_R[i], Lights_Color_G[i], Lights_Color_B[i]);
- accumcol += max(Lights_Kind[i], 0.0) * DoPointLightB(objectspacepos, Lights_X[i], Lights_Y[i], Lights_Z[i], Lights_Range[i], Lights_Color_R[i], Lights_Color_G[i], Lights_Color_B[i]);
- }
- // das sccumcolor mit 0,5 multipliziert wird sorgt nur
- //dafür das das Endergebnis nicht zu hell ist. Dass ist
- //eigentlich schon ein Beweis dafür, dass meine Arbeit noch nicht ganz stimmt
- vec4 resultcolor = vec4(accumcol * 0.5, 1.0);
- return resultcolor;
- }
- void main()
- {
- //alles Ubliche
- vec4 object_space_pos = vec4( in_Position, 1.0);
- gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
- v_vTexcoord = in_TextureCoord;
- v_vNormal = in_Normal;
- v_vPosition = in_Position;
- v_vColour = in_Colour;
- //hier wird die Hauptfunktion für das Licht ausgeführt
- v_vColour = DoLightingB(v_vColour, v_vPosition, v_vNormal);
- // folgender Codeblock hab ich aus dem Internet und errechnet NormalMatrix
- // in GLSL gibt es die 3x3 Matrix gl_modelmatrix
- // das ist die modelviewmatrix nur umgestellt und invertiert
- // allerdings erkennt GMS diese nicht an obwohl sie rot geschrieben ist
- // Get upper left 3x3 matrix of ModelView:
- // | a b c |
- // | d e f |
- // | g h i |
- mat3 M = mat3(gm_Matrices[MATRIX_WORLD_VIEW]);
- // Get determinant of M = a*e*i - a*f*h - b*d*i + b*f*g + c*d*h - c*e*g
- float dtm;
- dtm = M[0][0]*M[1][1]*M[2][2]; // a*e*i
- dtm -= M[0][0]*M[2][1]*M[1][2]; // a*f*h
- dtm -= M[1][0]*M[0][1]*M[2][2]; // b*d*i
- dtm += M[1][0]*M[2][1]*M[0][2]; // b*f*g
- dtm += M[2][0]*M[0][1]*M[1][2]; // c*d*h
- dtm -= M[2][0]*M[1][1]*M[0][2]; // c*e*g
- // Transpose I:
- mat3 NormalMatrix;
- NormalMatrix[0][0] = (M[1][1] * M[2][2] - M[1][2] * M[2][1]);
- NormalMatrix[1][0] = (M[0][2] * M[2][1] - M[0][1] * M[2][2]);
- NormalMatrix[2][0] = (M[0][1] * M[1][2] - M[0][2] * M[1][1]);
- NormalMatrix[0][1] = (M[1][2] * M[2][0] - M[1][0] * M[2][2]);
- NormalMatrix[1][1] = (M[0][0] * M[2][2] - M[0][2] * M[2][0]);
- NormalMatrix[2][1] = (M[0][2] * M[1][0] - M[0][0] * M[1][2]);
- NormalMatrix[0][2] = (M[1][0] * M[2][1] - M[1][1] * M[2][0]);
- NormalMatrix[1][2] = (M[0][1] * M[2][0] - M[0][0] * M[2][1]);
- NormalMatrix[2][2] = (M[0][0] * M[1][1] - M[0][1] * M[1][0]);
- NormalMatrix /= dtm;
- //nun haben wir unsere normale Matrix
- //jetzt berechnen wir den Tangentvektor
- vec3 normal = vec3(1.0,1.0,0.0);
- vec3 tangent;
- vec3 t1 = cross( normal, in_Position);
- vec3 t2 = cross( normal, in_Normal);
- if (length(t1) > length(t2)) {
- tangent = t1;
- }
- else {
- tangent = t2;
- }
- // nun normalisieren wir unsere Vektoren im Verhältnis
- // zur NormalMatrix und errechnen den Kreuzpunkt
- // und nun geht meine Unwissenheit los :)
- // ich denke ab hier unten hab ich die meisten Fehler drin
- vec3 N = normalize(NormalMatrix * in_Normal);
- vec3 T = normalize(NormalMatrix * tangent);
- vec3 B = normalize(cross(N, T));
- vec3 v;
- v.x = dot(normalize(ldir), T);
- v.y = dot(normalize(ldir), B);
- v.z = dot(normalize(ldir), N);
- v_vLightVec = normalize(v); //Lichtvektor
- vec3 vertexPosition = normalize(NormalMatrix * in_Position);
- v.x = dot(vertexPosition, T);
- v.y = dot(vertexPosition, B);
- v.z = dot(vertexPosition, N);
- eyeVec = normalize(v);
- vertexPosition = normalize(vertexPosition);
- halfVec = normalize(vertexPosition + normalize(ldir));
- v.x = dot(halfVec, T);
- v.y = dot(halfVec, B);
- v.z = dot(halfVec, N);
- halfVec = v;
- }
Fragment Shader:
GML-Quellcode
- varying vec2 v_vTexcoord;
- varying vec3 v_vNormal;
- varying vec3 v_vPosition;
- varying vec4 v_vColour;
- varying vec3 v_vLightVec;
- varying vec3 ldir;
- varying vec3 halfVec;
- varying vec3 eyeVec;
- uniform vec3 CamPos;
- uniform float specStrength;
- uniform sampler2D bumpmap;
- void main()
- {
- vec3 normal = texture2D(bumpmap, v_vTexcoord).rgb; //die Bumpmap
- normal = normalize(normal);
- float lamberFactor = max(dot(v_vLightVec, normal), 0.1) * 4.0; //der Lamberfaktor
- vec4 finalFactor = vec4(vec3(lamberFactor), 1.0);
- // hier wird die Lichtreflexion berechnet
- vec3 EyeDirection_cameraspace = CamPos - v_vPosition;// Richtungsvektor der Kamera
- vec3 E = normalize(EyeDirection_cameraspace);
- vec3 R = reflect(-normalize(ldir), normalize(v_vPosition)); // die Lichtreflexion
- float cosAlpha = clamp( dot( E, R ), 0.0, 1.0 );
- vec3 specCol = vec3(0.5, 0.5, 1.0);
- vec4 Specular = cosAlpha * vec4( specCol, 1.0);
- float shininess = pow(max(dot(halfVec, normal), 0.0), 2.0);
- gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord) * finalFactor;
- gl_FragColor += Specular * shininess;
- }
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Morpheus ()