shader Bumpmapping

Aus DGL Wiki
Version vom 28. Februar 2010, 21:37 Uhr von Flash (Diskussion | Beiträge) (Bumpmapping-Shader)

Wechseln zu: Navigation, Suche

Bumpmapping-Shader

Zurück zur Shadersammlung

Beschreibung Autor Version
per-Pixel-Beleuchtung unter Zuhilfenahme einer Normalmap um einen Bumpmapping Effekt zu erzeugen. Bergmann 1.0

Bilder

Die Originaltextur (Downloadvorlage)
Die Normalmap (Downloadvorlage)
Ergebnis

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);	
}