shader Bumpmapping: Unterschied zwischen den Versionen
Aus DGL Wiki
(→Code) |
Flash (Diskussion | Beiträge) 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 | + | N = normalize(gl_Normal); |
− | V | + | 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
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);
}