Environment mapping
Feladat leírás:
A példa program az Environment Mapping technikát mutatja be, amely lényege, hogy a megjelenített objektumok visszatükrözik környezetüket. A példa egy egyszerűbb változatot valósít meg, mivel csak egy objektumot jelenít meg, amely visszatükrözi a környezetet reprezentáló skybox-ot. A tükröződés effektus GLSL-ben íródott. A vertex shader a kamera pozíció és a megjelenített objektum aktuális vertexeinek pozíciója és normál vektora alapján kiszámítja a visszatükröződés irányvektorát, amelyet továbbad a fragment shader-nek. A fragment shader a tükröződés irányvektora alapján lekérdezi a skybox-ot borító cube map textúra megfelelő pixeljét, amit vissza kell tükröznie a megjelenített objektum megfelelő részének. A végleges pixel színt a megfelelő cube map textúra pixelből, az objektum színéből és a tükröződés intenzitásából számítja ki.
A vertex shader forráskódja (reflect.vert fájl tartalma):
#version 400
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexNormal;
out vec3 ReflectDir;
uniform bool DrawSkyBox;
uniform vec3 WorldCameraPosition;
uniform mat4 ModelMatrix;
uniform mat4 MVP;
void main()
{
if ( DrawSkyBox )
{
ReflectDir = VertexPosition;
}
else
{
vec3 worldPos = vec3(ModelMatrix * vec4(VertexPosition, 1.0));
vec3 worldNorm = vec3(ModelMatrix * vec4(VertexNormal, 0.0));
vec3 worldView;
worldView.x = WorldCameraPosition.x - worldPos.x;
worldView.y = WorldCameraPosition.y - worldPos.y;
worldView.z = WorldCameraPosition.z - worldPos.z;
worldView = normalize(worldView);
ReflectDir = reflect(-worldView, worldNorm);
}
gl_Position = MVP * vec4(VertexPosition, 1.0);
}
A fragment shader forráskódja (reflect.frag fájl tartalma):
#version 400
in vec3 ReflectDir;
uniform samplerCube CubeMapTex;
uniform bool DrawSkyBox;
uniform float ReflectFactor;
uniform vec4 MaterialColor;
layout( location = 0 ) out vec4 FragColor;
void main()
{
vec4 cubeMapColor = texture(CubeMapTex, ReflectDir);
if ( DrawSkyBox )
{
FragColor = cubeMapColor;
}
else
{
FragColor = mix(MaterialColor, cubeMapColor, ReflectFactor);
}
}
Szerző: Rigó Kristóf
Készítés dátuma: 2012.
Fejlesztőkörnyezet:
Microsoft Visual C++ 2010 Express Edition
GLSL 4.0-ás verziója
Felhasznált API-k, könyvtárak: a C++ főprogramhoz az OpenGL 4.0-ás API, glm 0.9.3.3, freeglut 2.8.0, glew 1.7.0
Letöltés
Julia fraktál
A Julia fraktál fragment shader forráskodja (julia.glsl fájl tartalma)
uniform sampler1D tex;
uniform vec2 c;
uniform int iter;
void main()
{
vec2 z;
z.x = 3.0 * (gl_TexCoord[0].x - 0.5);
z.y = 2.0 * (gl_TexCoord[0].y - 0.5);
int i;
for(i=0; i 4.0)
{
break;
}
z.x = x;
z.y = y;
}
gl_FragColor = texture1D(tex, (i == iter ? 0.0 : float(i)) / 100.0);
}
Letöltés