shader Bumpmapping
Aus DGL Wiki
Inhaltsverzeichnis
Bumpmapping-Shader
Zurück zur Shadersammlung
Beschreibung | Autor | Version |
---|---|---|
Beleuchtet Primitiven per Pixel unter der zuhilfenahme einer Normalmap um einen Bumpmapping Effekt zu erzeugen. | Bergmann | 1.0 |
Bilder
Beschreibung
foglt noch
Code
Vertexshader:
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;
}
Fragmentshader:
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
//dreht einen Punkt um eine Achse im Raum
//@a: Achse um die gedreht wird
//@p: Punkt der gedreht werden soll
//@rad: Winkel im BogenMaß
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(Texture1, 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, 0.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 * gl_FrontMaterial.diffuse * max(dot(normal, lightvec[i]), 0.0);
vec4 ISpecular = gl_LightSource[i].specular * gl_FrontMaterial.specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess);
EndColor += (IAmbient+IDiffuse+ISpecular);
}
EndColor += gl_FrontMaterial.emission;
gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor) * texture2D(Texture0, TexCoord);
}