/// <summary> /// Generates the normalisation cube map. /// </summary> /// <returns></returns> private bool GenerateNormalisationCubeMap() { var gl = openGLControl1.OpenGL; // First we create space to hold the data for a single face. // Each face is 32x32, and we need to store the R, G and B components of the color at each point. byte[] data = new byte[32 * 32 * 3]; // Some useful variables. int size = 32; float offset = 0.5f; float halfSize = 16.0f; Vertex tempVector = new Vertex(); uint byteCounter = 0; // Positive x. for (int j = 0; j < size; j++) { for (int i = 0; i < size; i++) { tempVector.X = (halfSize); tempVector.Y = (-(j + offset - halfSize)); tempVector.Z = (-(i + offset - halfSize)); tempVector.UnitLength(); tempVector = tempVector.GetPackedTo01(); data[byteCounter++] = (byte)(tempVector.X * 255f); data[byteCounter++] = (byte)(tempVector.Y * 255f); data[byteCounter++] = (byte)(tempVector.Z * 255f); } } // Set the texture image. gl.TexImage2D(OpenGL.GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, OpenGL.GL_RGBA8, 32, 32, 0, OpenGL.GL_RGB, OpenGL.GL_UNSIGNED_BYTE, data); //negative x byteCounter = 0; for (int j = 0; j < size; j++) { for (int i = 0; i < size; i++) { tempVector.X = (-halfSize); tempVector.Y = (-(j + offset - halfSize)); tempVector.Z = ((i + offset - halfSize)); tempVector.UnitLength(); tempVector = tempVector.GetPackedTo01(); data[byteCounter++] = (byte)(tempVector.X * 255f); data[byteCounter++] = (byte)(tempVector.Y * 255f); data[byteCounter++] = (byte)(tempVector.Z * 255f); } } gl.TexImage2D(OpenGL.GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, OpenGL.GL_RGBA8, 32, 32, 0, OpenGL.GL_RGB, OpenGL.GL_UNSIGNED_BYTE, data); //positive y byteCounter = 0; for (int j = 0; j < size; j++) { for (int i = 0; i < size; i++) { tempVector.X = (i + offset - halfSize); tempVector.Y = (halfSize); tempVector.Z = ((j + offset - halfSize)); tempVector.UnitLength(); tempVector = tempVector.GetPackedTo01(); data[byteCounter++] = (byte)(tempVector.X * 255f); data[byteCounter++] = (byte)(tempVector.Y * 255f); data[byteCounter++] = (byte)(tempVector.Z * 255f); } } gl.TexImage2D(OpenGL.GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, OpenGL.GL_RGBA8, 32, 32, 0, OpenGL.GL_RGB, OpenGL.GL_UNSIGNED_BYTE, data); //negative y byteCounter = 0; for (int j = 0; j < size; j++) { for (int i = 0; i < size; i++) { tempVector.X = (i + offset - halfSize); tempVector.Y = (-halfSize); tempVector.Z = (-(j + offset - halfSize)); tempVector.UnitLength(); tempVector = tempVector.GetPackedTo01(); data[byteCounter++] = (byte)(tempVector.X * 255f); data[byteCounter++] = (byte)(tempVector.Y * 255f); data[byteCounter++] = (byte)(tempVector.Z * 255f); } } gl.TexImage2D(OpenGL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, OpenGL.GL_RGBA8, 32, 32, 0, OpenGL.GL_RGB, OpenGL.GL_UNSIGNED_BYTE, data); //positive z byteCounter = 0; for (int j = 0; j < size; j++) { for (int i = 0; i < size; i++) { tempVector.X = (i + offset - halfSize); tempVector.Y = (-(j + offset - halfSize)); tempVector.Z = (halfSize); tempVector.UnitLength(); tempVector = tempVector.GetPackedTo01(); data[byteCounter++] = (byte)(tempVector.X * 255f); data[byteCounter++] = (byte)(tempVector.Y * 255f); data[byteCounter++] = (byte)(tempVector.Z * 255f); } } gl.TexImage2D(OpenGL.GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, OpenGL.GL_RGBA8, 32, 32, 0, OpenGL.GL_RGB, OpenGL.GL_UNSIGNED_BYTE, data); //negative z byteCounter = 0; for (int j = 0; j < size; j++) { for (int i = 0; i < size; i++) { tempVector.X = (-(i + offset - halfSize)); tempVector.Y = (-(j + offset - halfSize)); tempVector.Z = (-halfSize); tempVector.UnitLength(); tempVector = tempVector.GetPackedTo01(); data[byteCounter++] = (byte)(tempVector.X * 255f); data[byteCounter++] = (byte)(tempVector.Y * 255f); data[byteCounter++] = (byte)(tempVector.Z * 255f); } } gl.TexImage2D(OpenGL.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, OpenGL.GL_RGBA8, 32, 32, 0, OpenGL.GL_RGB, OpenGL.GL_UNSIGNED_BYTE, data); return true; }