This page was last updated: January 3, 2025
![]() | ![]() | ![]() | ![]() |
Refraction | Refraction with Noise | Reflection | Reflection with Noise |
Using a GLIB file (for glman) or using the GLSL API, use the following uniform variables:
Parameter | What It Does | Does it have to be varied? |
---|---|---|
uMix | Blend of reflection and refraction | Yes |
uNoiseAmp | Noise Amplitude | Yes |
uNoiseFreq | Noise Frequency | Yes |
uEta | Index of refraction | No |
uWhiteMix | Mixing of WHITE with the refraction | No |
##OpenGL GLIB
Perspective 70
LookAt 0 0 3 0 0 0 0 1 0
Vertex texture.vert
Fragment texture.frag
Program Texture TexUnit 6
Texture2D 6 nvposx.bmp
QuadYZ 5. 5. 10 10
Texture2D 6 nvnegx.bmp
QuadYZ -5. 5. 10 10
Texture2D 6 nvposy.bmp
QuadXZ 5. 5. 10 10
Texture2D 6 nvnegy.bmp
QuadXZ -5. 5. 10 10
Texture2D 6 nvposz.bmp
QuadXY 5. 5. 10 10
Texture2D 6 nvnegz.bmp
QuadXY -5. 5. 10 10
CubeMap 6 nvposx.bmp nvnegx.bmp nvposy.bmp nvnegy.bmp nvposz.bmp nvnegz.bmp
CubeMap 7 nvposx.bmp nvnegx.bmp nvposy.bmp nvnegy.bmp nvposz.bmp nvnegz.bmp
Vertex cube.vert
Fragment cube.frag
Program Cube \
uReflectUnit 6 \
uRefractUnit 7 \
uMix <0. 0. 1.> \
uNoiseAmp <0. 0. 5.> \
uNoiseFreq <0.0 0.1 0.5> \
uWhiteMix 0.2 \
uEta 1.4
Scale 0.4
Obj cow.obj
float Eta; float Mix; float NoiseAmp; float NoiseFreq; GLSLProgram Pattern; GLuint CubeName; char * FaceFiles[6] = { "kec.posx.bmp", "kec.negx.bmp", "kec.posy.bmp", "kec.negy.bmp", "kec.posz.bmp", "kec.negz.bmp" }; . . . void InitGraphics( ) { // open the window . . . // setup the callbacks . . . // initialize glew . . . // create and compile the shader . . . // set the uniform variables that don't need to vary . . . glGenTextures( 1, &CubeName ); glBindTexture( GL_TEXTURE_CUBE_MAP, CubeName ); glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT ); glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameterf( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); for( int file = 0; file < 6; file++ ) { int nums, numt; unsigned char * texture2d = BmpToTexture( FaceFiles[file], &nums, &numt ); if( texture2d == NULL ) fprintf( stderr, "Could not open BMP 2D texture '%s'", FaceFiles[file] ); else fprintf( stderr, "BMP 2D texture '%s' read -- nums = %d, numt = %d\n", FaceFiles[file], nums, numt ); glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X + file, 0, 3, nums, numt, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2d ); delete [ ] texture2d; } . . . void Display( ) { . . . int ReflectUnit = 5; int RefractUnit = 6; Pattern.Use( ); glActiveTexture( GL_TEXTURE0 + ReflectUnit ); glBindTexture( GL_TEXTURE_CUBE_MAP, CubeName ); glActiveTexture( GL_TEXTURE0 + RefractUnit ); glBindTexture( GL_TEXTURE_CUBE_MAP, CubeName ); Pattern.SetUniformVariable( "uReflectUnit", ReflectUnit ); Pattern.SetUniformVariable( "uRefractUnit", RefractUnit ); Pattern.SetUniformVariable( "uMix", Mix ); Pattern.SetUniformVariable( "uEta", Eta ) glCallList( ObjectList ); Pattern.UnUse; }
#version 330 compatibility out vec3 vNormal; out vec3 vEyeDir; out vec3 vMC; void main( ) { vMC = gl_Vertex.xyz; vec3 ECposition = ( gl_ModelViewMatrix * gl_Vertex ).xyz; vEyeDir = ECposition.xyz - vec3( 0., 0., 0. ) ; // vector from the eye position to the point vNormal = normalize( gl_Normal ); gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
#version 330 compatibility uniform sampler3D Noise3; uniform float uNoiseAmp; uniform float uNoiseFreq; uniform float uEta; uniform float uMix; uniform float uWhiteMix; uniform samplerCube uReflectUnit; uniform samplerCube uRefractUnit; in vec3 vNormal; in vec3 vEyeDir; in vec3 vMC; const vec3 WHITE = vec3( 1.,1.,1. ); vec3 PerturbNormal3( float angx, float angy, float angz, vec3 n ) { float cx = cos( angx ); float sx = sin( angx ); float cy = cos( angy ); float sy = sin( angy ); float cz = cos( angz ); float sz = sin( angz ); // rotate about x: float yp = n.y*cx - n.z*sx; // y' n.z = n.y*sx + n.z*cx; // z' n.y = yp; // n.x = n.x; // rotate about y: float xp = n.x*cy + n.z*sy; // x' n.z = -n.x*sy + n.z*cy; // z' n.x = xp; // n.y = n.y; // rotate about z: xp = n.x*cz - n.y*sz; // x' n.y = n.x*sz + n.y*cz; // y' n.x = xp; // n.z = n.z; return normalize( n ); } void main( ) { vec3 Normal = ????? // remember to unitize this vec3 Eye = ????? // remember to unitize this vec4 nvx = texture( Noise3, uNoiseFreq*vMC ); vec4 nvy = texture( Noise3, uNoiseFreq*vec3(vMC.xy,vMC.z+0.33) ); vec4 nvz = texture( Noise3, uNoiseFreq*vec3(vMC.xy,vMC.z+0.67) ); float angx = nvx.r + nvx.g + nvx.b + nvx.a; // 1. -> 3. angx = angx - 2.; // -1. -> 1. angx *= uNoiseAmp; float angy = nvy.r + nvy.g + nvy.b + nvy.a; // 1. -> 3. angy = angy - 2.; // -1. -> 1. angy *= uNoiseAmp; float angz = nvz.r + nvz.g + nvz.b + nvz.a; // 1. -> 3. angz = angz - 2.; // -1. -> 1. angz *= uNoiseAmp; Normal = PerturbNormal3( angx, angy, angz, Normal ); Normal = normalize( gl_NormalMatrix * Normal ); vec3 reflectVector = ????? vec3 reflectColor = ?????.rgb vec3 refractVector = ????? vec3 refractColor; if( all( equal( refractVector, vec3(0.,0.,0.) ) ) ) { refractColor = reflectColor; } else { refractColor = texture( uRefractUnit, refractVector ).rgb; refractColor = mix( refractColor, WHITE, uWhiteMix ); } gl_FragColor = mix( ?????, ?????, uMix ); }
These are only used for wall decorations. They don't actually participate in the cube mapping, but the cube mapping looks weird without them.
texture.vert:
#version 330 compatibility out vec2 vST; void main( ) { vST = gl_MultiTexCoord0.st; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
texture.frag:
#version 330 compatibility uniform sampler2D TexUnit; in vec2 vST; void main( ) { vec3 newcolor = texture( TexUnit, vST ).rgb; gl_FragColor = vec4( newcolor, 1. ); }
Use Canvas to turn in your:
Want to use the Nvidia Lobby in a cube map?
Here are the files:
nvposx.bmp
nvnegx.bmp
nvposy.bmp
nvnegy.bmp
nvposz.bmp
nvnegz.bmp
Want to use the Kelley Engineering Center Atrium in a cube map?
Here are the files:
kec.posx.bmp
kec.negx.bmp
kec.posy.bmp
kec.negy.bmp
kec.posz.bmp
kec.negz.bmp
Here is a good source of other cube maps.
Feature | Points |
---|---|
Refracts correctly | 30 |
Reflects correctly | 30 |
Bump-maps correctly | 40 |
Potential Total | 100 |