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
b
生成一个立方体贴图(Cube Map)
最新推荐文章于 2025-04-14 16:33:16 发布