shader Bumpmapping

Aus DGL Wiki
Version vom 28. Februar 2010, 21:35 Uhr von Flash (Diskussion | Beiträge) (Code: Umgebrochen, so dass der Code auf kleineren Auflösungen nicht das Bild sprengt.)

Wechseln zu: Navigation, Suche

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

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