A GLSL programozási nyelv

Példaprogramok

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