shader Bumpmapping: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Code)
K (Code: Umgebrochen, so dass der Code auf kleineren Auflösungen nicht das Bild sprengt.)
Zeile 32: Zeile 32:
 
{
 
{
 
gl_TexCoord[0]  = gl_MultiTexCoord0;
 
gl_TexCoord[0]  = gl_MultiTexCoord0;
N         = normalize(gl_Normal);
+
N         = normalize(gl_Normal);
V = vec3(gl_ModelViewMatrix * gl_Vertex);
+
V = vec3(gl_ModelViewMatrix * gl_Vertex);
 
for(int i = 0; i < LIGHT_COUNT; i++){
 
for(int i = 0; i < LIGHT_COUNT; i++){
 
lightvec[i] = normalize(gl_LightSource[i].position.xyz - V);
 
lightvec[i] = normalize(gl_LightSource[i].position.xyz - V);
Zeile 74: Zeile 74:
 
vec3 Reflected = normalize(reflect(-lightvec[i], normal));  
 
vec3 Reflected = normalize(reflect(-lightvec[i], normal));  
 
vec4 IAmbient  = gl_LightSource[i].ambient  * gl_FrontMaterial.ambient;
 
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 IDiffuse  = gl_LightSource[i].diffuse  * gl_FrontMaterial.diffuse  *  
vec4 ISpecular = gl_LightSource[i].specular * gl_FrontMaterial.specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess);
+
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 += (IAmbient+IDiffuse+ISpecular);
 
}
 
}
 
EndColor += gl_FrontMaterial.emission;
 
EndColor += gl_FrontMaterial.emission;
  
gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor) * texture2D(Texture0, TexCoord);
+
gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor) *  
 +
texture2D(Texture0, TexCoord);
 
}</source>
 
}</source>

Version vom 28. Februar 2010, 21:35 Uhr

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