void CreateCube(float xShift, float yShift, float zShift) { float edgeLength = 25.0f * scale; M3DVector3f bodenVertices[8]; M3DVector4f bodenColors[8]; m3dLoadVector3(bodenVertices[0], -edgeLength + xShift, -edgeLength + yShift, -edgeLength + zShift); m3dLoadVector3(bodenVertices[1], edgeLength + xShift, -edgeLength + yShift, -edgeLength + zShift); m3dLoadVector3(bodenVertices[2], edgeLength + xShift, edgeLength + yShift, -edgeLength + zShift); m3dLoadVector3(bodenVertices[3], -edgeLength + xShift, edgeLength + yShift, -edgeLength + zShift); m3dLoadVector3(bodenVertices[4], -edgeLength + xShift, edgeLength + yShift, edgeLength + zShift); m3dLoadVector3(bodenVertices[5], -edgeLength + xShift, -edgeLength + yShift, edgeLength + zShift); m3dLoadVector3(bodenVertices[6], edgeLength + xShift, -edgeLength + yShift, edgeLength + zShift); m3dLoadVector3(bodenVertices[7], edgeLength + xShift, -edgeLength + yShift, -edgeLength + zShift); m3dLoadVector4(bodenColors[0], 0.0f, 0.0f, 0.5f, 1); m3dLoadVector4(bodenColors[1], 0.0f, 0.0f, 0.5f, 1); m3dLoadVector4(bodenColors[2], 0.0f, 0.0f, 0.5f, 1); m3dLoadVector4(bodenColors[3], 0.0f, 0.0f, 0.5f, 1); m3dLoadVector4(bodenColors[4], 0.0f, 0.0f, 0.7f, 1); m3dLoadVector4(bodenColors[5], 0.0f, 0.0f, 0.7f, 1); m3dLoadVector4(bodenColors[6], 0.0f, 0.0f, 0.7f, 1); m3dLoadVector4(bodenColors[7], 0.0f, 0.0f, 0.7f, 1); cboden.Begin(GL_TRIANGLE_FAN, 8); cboden.CopyVertexData3f(bodenVertices); cboden.CopyColorData4f(bodenColors); cboden.End(); M3DVector3f deckenVertices[8]; M3DVector4f deckenColors[8]; m3dLoadVector3(deckenVertices[0], edgeLength + xShift, edgeLength + yShift, edgeLength + zShift); m3dLoadVector3(deckenVertices[1], edgeLength + xShift, -edgeLength + yShift, -edgeLength + zShift); m3dLoadVector3(deckenVertices[2], edgeLength + xShift, -edgeLength + yShift, edgeLength + zShift); m3dLoadVector3(deckenVertices[3], -edgeLength + xShift, -edgeLength + yShift, edgeLength + zShift); m3dLoadVector3(deckenVertices[4], -edgeLength + xShift, edgeLength + yShift, edgeLength + zShift); m3dLoadVector3(deckenVertices[5], -edgeLength + xShift, edgeLength + yShift, -edgeLength + zShift); m3dLoadVector3(deckenVertices[6], edgeLength + xShift, edgeLength + yShift, -edgeLength + zShift); m3dLoadVector3(deckenVertices[7], edgeLength + xShift, -edgeLength + yShift, -edgeLength + zShift); m3dLoadVector4(deckenColors[0], 0.7f, 0.2f, 0.0f, 1); m3dLoadVector4(deckenColors[1], 0.7f, 0.2f, 0.0f, 1); m3dLoadVector4(deckenColors[2], 0.7f, 0.2f, 0.0f, 1); m3dLoadVector4(deckenColors[3], 0.7f, 0.0f, 0.0f, 1); m3dLoadVector4(deckenColors[4], 0.7f, 0.0f, 0.0f, 1); m3dLoadVector4(deckenColors[5], 0.7f, 0.0f, 0.0f, 1); m3dLoadVector4(deckenColors[6], 0.7f, 0.0f, 0.0f, 1); m3dLoadVector4(deckenColors[7], 0.7f, 0.2f, 0.0f, 1); decke.Begin(GL_TRIANGLE_FAN, 8); decke.CopyVertexData3f(deckenVertices); decke.CopyColorData4f(deckenColors); decke.End(); }
////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering // context. void SetupRC() { // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // This makes a torus gltMakeTorus(torusBatch, 0.4f, 0.15f, 30, 30); // This make a sphere gltMakeSphere(sphereBatch, 0.1f, 26, 13); floorBatch.Begin(GL_LINES, 324); for(GLfloat x = -20.0; x <= 20.0f; x+= 0.5) { floorBatch.Vertex3f(x, -0.55f, 20.0f); floorBatch.Vertex3f(x, -0.55f, -20.0f); floorBatch.Vertex3f(20.0f, -0.55f, x); floorBatch.Vertex3f(-20.0f, -0.55f, x); } floorBatch.End(); // Randomly place the spheres for(int i = 0; i < NUM_SPHERES; i++) { GLfloat x = ((GLfloat)((rand() % 400) - 200) * 0.1f); GLfloat z = ((GLfloat)((rand() % 400) - 200) * 0.1f); spheres[i].SetOrigin(x, 0.0f, z); } }
void SetupRC() { // Blue background glClearColor(0.0f, 0.0f, 1.0f, 1.0f); shaderManager.InitializeStockShaders(); GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f }; GLfloat vColors[] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f }; triangleBatch.Begin(GL_TRIANGLES, 3); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.CopyColorData4f(vColors); triangleBatch.End(); myIdentityShader = gltLoadShaderPairWithAttributes("ShadedIdentity.vp", "ShadedIdentity.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_COLOR, "vColor"); }
////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering // context. void SetupRC() { // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); #ifndef OPENGL_ES glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #else torusBatch.SetPrimitiveType(GL_LINE_LOOP); #endif glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // This makes a torus gltMakeTorus(torusBatch, 0.4f, 0.15f, 30, 30); floorBatch.Begin(GL_LINES, 324); for(GLfloat x = -20.0; x <= 20.0f; x+= 0.5) { floorBatch.Vertex3f(x, -0.55f, 20.0f); floorBatch.Vertex3f(x, -0.55f, -20.0f); floorBatch.Vertex3f(20.0f, -0.55f, x); floorBatch.Vertex3f(-20.0f, -0.55f, x); } floorBatch.End(); }
////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering // context. void SetupRC() { // Make sure OpenGL entry points are set glewInit(); // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // This makes a torus gltMakeTorus(torusBatch, 0.4f, 0.15f, 40, 20); // This makes a sphere gltMakeSphere(sphereBatch, 0.1f, 26, 13); // Make the solid ground GLfloat texSize = 10.0f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.MultiTexCoord2f(0, texSize, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.MultiTexCoord2f(0, texSize, texSize); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.MultiTexCoord2f(0, 0.0f, texSize); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); // Make 3 texture objects glGenTextures(3, uiTextures); // Load the Marble glBindTexture(GL_TEXTURE_2D, uiTextures[0]); LoadTGATexture("marble.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Load Mars glBindTexture(GL_TEXTURE_2D, uiTextures[1]); LoadTGATexture("marslike.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); // Load Moon glBindTexture(GL_TEXTURE_2D, uiTextures[2]); LoadTGATexture("moonlike.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); // Randomly place the spheres for(int i = 0; i < NUM_SPHERES; i++) { GLfloat x = ((GLfloat)((rand() % 400) - 200) * 0.1f); GLfloat z = ((GLfloat)((rand() % 400) - 200) * 0.1f); spheres[i].SetOrigin(x, 0.0f, z); } }
void initFloorBatch() { float alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN,4,1); floorBatch.Color4f(0.0f,1.0f,0.0f,alpha); floorBatch.MultiTexCoord2f(0,0.0,0.0); floorBatch.Normal3f(0.0,1.0,0.0); floorBatch.Vertex3f(-20.0f,-0.4f,20.0f); floorBatch.Color4f(0.0f,1.0f,0.0f,alpha); floorBatch.MultiTexCoord2f(0,10.0,0.0); floorBatch.Normal3f(0.0,1.0,0.0); floorBatch.Vertex3f(20.0f,-0.4f,20.0f); floorBatch.Color4f(0.0f,1.0f,0.0f,alpha); floorBatch.MultiTexCoord2f(0,10.0,10.0); floorBatch.Normal3f(0.0,1.0,0.0); floorBatch.Vertex3f(20.0f,-0.4f,-20.0f); floorBatch.Color4f(0.0f,1.0f,0.0f,alpha); floorBatch.MultiTexCoord2f(0,0.0,10.0); floorBatch.Normal3f(0.0,1.0,0.0); floorBatch.Vertex3f(-20.0f,-0.4f,-20.0f); floorBatch.End(); }
void SetupRC() { // Background glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); viewFrame.MoveForward(4.0f); shaderManager.InitializeStockShaders(); // Simple triangle // Load up a triangle GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f }; GLfloat vTexCoords [] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.5f, 1.0f }; triangleBatch.Begin(GL_TRIANGLES, 3, 1); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.CopyTexCoordData2f(vTexCoords, 0); triangleBatch.End(); texturedIdentity = gltLoadShaderPairWithAttributes("TexturedIdentity.vp", "TexturedIdentity.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "vTexCoords"); glGenTextures(1, &stoneTexture); glBindTexture(GL_TEXTURE_2D, stoneTexture); LoadTGATexture("Stone.tga", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); }
/** * @brief Initialization on the rendering context. */ void SetupRC() { // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // This makes a torus gltMakeSphere(sunSphereBatch, 0.4f, 30, 30); // This make a sphere gltMakeSphere(earthSphereBatch, 0.2f, 26, 13); // This make a small sphere gltMakeSphere(moonSphereBatch, 0.1, 18, 9); // Make the floor floorBatch.Begin(GL_LINES, 324); for(GLfloat x = -20.0; x <= 20.0f; x+= 0.5) { floorBatch.Vertex3f(x, -0.55f, 20.0f); floorBatch.Vertex3f(x, -0.55f, -20.0f); floorBatch.Vertex3f(20.0f, -0.55f, x); floorBatch.Vertex3f(-20.0f, -0.55f, x); } floorBatch.End(); }
/////////////////////////////////////////////////////////////////////////////////////////////////////// // Create a matrix that maps geometry to the screen. 1 unit in the x direction equals one pixel // of width, same with the y direction. // It also depends on the size of the texture being displayed void GenerateOrtho2DMat(GLuint windowWidth, GLuint windowHeight, GLuint imageWidth, GLuint imageHeight) { float right = (float)windowWidth; float quadWidth = right; float left = 0.0f; float top = (float)windowHeight; float quadHeight = top; float bottom = 0.0f; float screenAspect = (float)windowWidth/windowHeight; float imageAspect = (float)imageWidth/imageHeight; if (screenAspect > imageAspect) quadWidth = windowHeight*imageAspect; else quadHeight = windowWidth*imageAspect; // set ortho matrix orthoMatrix[0] = (float)(2 / (right - left)); orthoMatrix[1] = 0.0; orthoMatrix[2] = 0.0; orthoMatrix[3] = 0.0; orthoMatrix[4] = 0.0; orthoMatrix[5] = (float)(2 / (top - bottom)); orthoMatrix[6] = 0.0; orthoMatrix[7] = 0.0; orthoMatrix[8] = 0.0; orthoMatrix[9] = 0.0; orthoMatrix[10] = (float)(-2 / (1.0 - 0.0)); orthoMatrix[11] = 0.0; orthoMatrix[12] = -1*(right + left) / (right - left); orthoMatrix[13] = -1*(top + bottom) / (top - bottom); orthoMatrix[14] = -1.0f; orthoMatrix[15] = 1.0; // set screen quad vertex array screenQuad.Reset(); screenQuad.Begin(GL_TRIANGLE_STRIP, 4, 1); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 0.0f); screenQuad.Vertex3f(0.0f, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 0.0f); screenQuad.Vertex3f(quadWidth, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 1.0f); screenQuad.Vertex3f(0.0f, quadHeight, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 1.0f); screenQuad.Vertex3f(quadWidth, quadHeight, 0.0f); screenQuad.End(); }
void SetupRC(void) { shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gltMakeSphere(sphereBatch, 0.2f, 26, 13); gltMakeTorus(torusBatch, 0.4f, 0.15f, 30, 30); for (size_t i = 0; i < NUM_SPHERES; ++i) { float x = (GLfloat(rand() % 400) - 200.0f) * 0.1f; float z = (GLfloat(rand() % 400) - 200.0f) * 0.1f; sphereFrames[i].SetOrigin(x, 0.0f, z); } //Make the solid ground GLfloat texSize = 10.0f; floorBatch.Begin(GL_TRIANGLE_FAN, 4,1); { //没看懂纹理和顶点的映射关系 floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.MultiTexCoord2f(0, texSize, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.MultiTexCoord2f(0, texSize, texSize); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.MultiTexCoord2f(0, 0.0f, texSize); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); } floorBatch.End(); // Make 3 texture objects glGenTextures(3, uiTextures); // Load the Marble glBindTexture(GL_TEXTURE_2D, uiTextures[0]); LoadTGATexture("marble.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Load Mars glBindTexture(GL_TEXTURE_2D, uiTextures[1]); LoadTGATexture("marslike.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); // Load Moon glBindTexture(GL_TEXTURE_2D, uiTextures[2]); LoadTGATexture("moonlike.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); }
void SetupPC() { glClearColor(0.75f, 0.75f, 0.75f,1.0f); shaderManager.InitializeStockShaders(); SquareRotationBatch.Begin(GL_TRIANGLE_FAN, 4); SquareRotationBatch.CopyVertexData3f(Square); SquareRotationBatch.End(); }
void MyGLWidget::initializeGL() { glewInit(); glClearColor(0.f, 0.f, 1.f, 1.f); shaderManager.InitializeStockShaders(); squareBatch.Begin(GL_QUADS, 4); squareBatch.CopyVertexData3f(vVerts); squareBatch.End(); }
/////////////////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering context. // This is the first opportunity to do any OpenGL related tasks. void SetupRC() { // Black background glClearColor(0.0f, 0.0f, 1.0f, 1.0f ); shaderManager.InitializeStockShaders(); // Load up a triangle squareBatch.Begin(GL_TRIANGLE_FAN, 4); squareBatch.CopyVertexData3f(vVerts); squareBatch.End(); }
// This function does any needed initialization on the rendering context. // This is the first opportunity to do any OpenGL related tasks. void SetupRC() { glClearColor(0.7f, 0.7f, 0.7f, 1.0f ); shaderManager.InitializeStockShaders(); // Load up a triangle triangleBatch.Begin(GL_TRIANGLES, 3); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.CopyColorData4f(vColors); triangleBatch.End(); }
/////////////////////////////////////////////////////////////////////////////////////////////////////// // Create a matrix that maps geometry to the screen. 1 unit in the x directionequals one pixel // of width, same with the y direction. // void GenerateOrtho2DMat(GLuint imageWidth, GLuint imageHeight) { float right = (float)imageWidth; float quadWidth = right; float left = 0.0f; float top = (float)imageHeight; float quadHeight = top; float bottom = 0.0f; // set ortho matrix orthoMatrix[0] = (float)(2 / (right)); orthoMatrix[1] = 0.0; orthoMatrix[2] = 0.0; orthoMatrix[3] = 0.0; orthoMatrix[4] = 0.0; orthoMatrix[5] = (float)(2 / (top)); orthoMatrix[6] = 0.0; orthoMatrix[7] = 0.0; orthoMatrix[8] = 0.0; orthoMatrix[9] = 0.0; orthoMatrix[10] = (float)(-2 / (1.0 - 0.0)); orthoMatrix[11] = 0.0; orthoMatrix[12] = -1.0f; orthoMatrix[13] = -1.0f; orthoMatrix[14] = -1.0f; orthoMatrix[15] = 1.0; // set screen quad vertex array screenQuad.Reset(); screenQuad.Begin(GL_TRIANGLE_STRIP, 4, 1); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 0.0f); screenQuad.Vertex3f(0.0f, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 0.0f); screenQuad.Vertex3f(right, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 1.0f); screenQuad.Vertex3f(0.0f, top, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 1.0f); screenQuad.Vertex3f(right, top, 0.0f); screenQuad.End(); }
/////////////////////////////////////////////////////////////////////////////////////////////////////// // Create a matrix that maps geometry to the screen. 1 unit in the x directionequals one pixel // of width, same with the y direction. void gltGenerateOrtho2DMat(GLuint screenWidth, GLuint screenHeight, M3DMatrix44f &orthoMatrix, GLBatch &screenQuad) { float right = (float)screenWidth; float left = 0.0f; float top = (float)screenHeight; float bottom = 0.0f; // set ortho matrix orthoMatrix[0] = (float)(2 / (right - left)); orthoMatrix[1] = 0.0; orthoMatrix[2] = 0.0; orthoMatrix[3] = 0.0; orthoMatrix[4] = 0.0; orthoMatrix[5] = (float)(2 / (top - bottom)); orthoMatrix[6] = 0.0; orthoMatrix[7] = 0.0; orthoMatrix[8] = 0.0; orthoMatrix[9] = 0.0; orthoMatrix[10] = (float)(-2 / (1.0 - 0.0)); orthoMatrix[11] = 0.0; orthoMatrix[12] = -1*(right + left) / (right - left); orthoMatrix[13] = -1*(top + bottom) / (top - bottom); orthoMatrix[14] = -1.0f; orthoMatrix[15] = 1.0; // set screen quad vertex array screenQuad.Reset(); screenQuad.Begin(GL_TRIANGLE_STRIP, 4, 1); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 0.0f); screenQuad.Vertex3f(0.0f, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 0.0f); screenQuad.Vertex3f((float)screenWidth, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 1.0f); screenQuad.Vertex3f(0.0f, (float)screenHeight, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 1.0f); screenQuad.Vertex3f((float)screenWidth, (float)screenHeight, 0.0f); screenQuad.End(); }
/////////////////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering context. // This is the first opportunity to do any OpenGL related tasks. void SetupRC() { // Blue background glClearColor(0.0f, 0.0f, 1.0f, 1.0f ); shaderManager.InitializeStockShaders(); // Load up a triangle GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f }; triangleBatch.Begin(GL_TRIANGLES, 3); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.End(); }
//为程序作一次性的设置 void SetupRC() { //设置背影颜色 glClearColor(0.0f, 0.0f, 1.0f, 1.0f); //初始化着色管理器 shaderManager.InitializeStockShaders(); //设置三角形,其中数组vVert包含所有3个顶点的x,y,笛卡尔坐标对。 GLfloat vVerts[] = { -0.5f,0.0f,0.0f, 0.5f,0.0f,0.0f, 0.0f,0.5f,0.0f, }; //批次处理 triangleBatch.Begin(GL_TRIANGLES,3); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.End(); }
/////////////////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering context. // This is the first opportunity to do any OpenGL related tasks. void SetupRC() { // Blue background glClearColor(0.0f, 0.0f, 1.0f, 1.0f ); shaderManager.InitializeStockShaders(); // Load up a triangle GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f }; triangleBatch.Begin(GL_TRIANGLES, 3); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.End(); myIdentityShader = shaderManager.LoadShaderPairWithAttributes("Identity.vp", "Identity.fp", 1, GLT_ATTRIBUTE_VERTEX, "vVertex"); }
///////////////////////////////////////////////////////////////////////////// // Make the floor, just the verts and texture coordinates, no normals void MakeFloor(GLBatch& floorBatch) { GLfloat x = 5.0f; GLfloat y = -1.0f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Vertex3f(-x, y, x); floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f); floorBatch.Vertex3f(x, y, x); floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f); floorBatch.Vertex3f(x, y, -x); floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f); floorBatch.Vertex3f(-x, y, -x); floorBatch.End(); }
void SetupRC() { glClearColor(0, 0, 0, 1); shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); gltMakeSphere(sphereBatch, 0.4, 20, 20); gltMakeCube(cubeBatch, 0.3); // Load up a triangle GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f }; GLfloat vColors [] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f }; triangleBatch.Begin(GL_TRIANGLES, 3); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.CopyColorData4f(vColors); triangleBatch.End(); mWcgCube.SetupCube(); /*transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);*/ cameraFrame.MoveForward(-3.0f); m3dLoadIdentity44(mRotation); myShader = gltLoadShaderPairWithAttributes("shader.vp", "shader.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_COLOR, "vColor"); locMVP = glGetUniformLocation(myShader, "mvpMatrix"); }
void SetupRC(void) { // Make sure OpenGL entry points are set //glewInit(); shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gltMakeTorus(torusBatch, 0.3f, 0.1f, 52, 26); gltMakeSphere(sphereBatch, 0.1f, 26, 13); //make the solid ground GLfloat texSize = 10.0f; floorBatch.Begin(GL_TRIANGLE_FAN,4,1); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Vertex3f(-20.f, -0.41f, 20.f); floorBatch.MultiTexCoord2f(0, texSize, 0.0f); floorBatch.Vertex3f(20.f, -0.41f, 20.f); floorBatch.MultiTexCoord2f(0, texSize, texSize); floorBatch.Vertex3f(20.f, -0.41f, -20.f); floorBatch.MultiTexCoord2f(0, 0.0f, texSize); floorBatch.Vertex3f(-20.f, -0.41f, -20.f); floorBatch.End(); int x = 400; int y = 200; int width = 300; int height = 155; logoBatch.Begin(GL_TRIANGLE_FAN, 4, 1); //像素点的原点是左上角, 根据GL_TRIANGLE_FAN 做了调整 // Upper left hand corner logoBatch.MultiTexCoord2f(0, 0.0f, height); logoBatch.Vertex3f(x, y, 0.0f); logoBatch.MultiTexCoord2f(0, 0.0f, 0.0f); logoBatch.Vertex3f(x, y - height, 0.0f); // Lower right hand corner logoBatch.MultiTexCoord2f(0, width, 0.0f); logoBatch.Vertex3f(x + width, y - height, 0.0f); // Upper righ hand corner logoBatch.MultiTexCoord2f(0, width, height); logoBatch.Vertex3f(x + width, y, 0.0f); logoBatch.End(); glGenTextures(4, uiTextures); // Load the Marble glBindTexture(GL_TEXTURE_2D, uiTextures[0]); LoadTGATexture("marble.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Load Mars glBindTexture(GL_TEXTURE_2D, uiTextures[1]); LoadTGATexture("marslike.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); // Load Moon glBindTexture(GL_TEXTURE_2D, uiTextures[2]); LoadTGATexture("moonlike.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); // Load the Logo glBindTexture(GL_TEXTURE_RECTANGLE, uiTextures[3]); LoadTGATextureRect("OpenGL-Logo.tga", GL_NEAREST, GL_NEAREST, GL_CLAMP_TO_EDGE); sphereWolrdShader = gltLoadShaderPairWithAttributes("RectReplace.vp", "RectReplace.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "vTexCoord"); locMVP = glGetUniformLocation(sphereWolrdShader, "mvpMatrix"); locTexture = glGetUniformLocation(sphereWolrdShader, "rectangleImage"); // -200,200 // Randomly place the spheres for (int i = 0; i < NUM_SPHERES; i++) { GLfloat x = ((GLfloat)((rand() % 400) - 200) * 0.1f); GLfloat z = ((GLfloat)((rand() % 400) - 200) * 0.1f); spheres[i].SetOrigin(x, 0.0f, z); } }
////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering // context. Here it sets up and initializes the texture objects. void SetupRC() { GLbyte *pBytes; GLint iWidth, iHeight, iComponents; GLenum eFormat; GLint iLoop; // Black background glClearColor(0.0f, 0.0f, 0.0f,1.0f); shaderManager.InitializeStockShaders(); // Load textures glGenTextures(TEXTURE_COUNT, textures); for(iLoop = 0; iLoop < TEXTURE_COUNT; iLoop++) { // Bind to next texture object glBindTexture(GL_TEXTURE_2D, textures[iLoop]); // Load texture, set filter and wrap modes pBytes = gltReadTGABits(szTextureFiles[iLoop],&iWidth, &iHeight, &iComponents, &eFormat); // Load texture, set filter and wrap modes glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytes); glGenerateMipmap(GL_TEXTURE_2D); // Don't need original texture data any more free(pBytes); } // Build Geometry GLfloat z; floorBatch.Begin(GL_TRIANGLE_STRIP, 28, 1); for(z = 60.0f; z >= 0.0f; z -=10.0f) { floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Vertex3f(-10.0f, -10.0f, z); floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f); floorBatch.Vertex3f(10.0f, -10.0f, z); floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f); floorBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f); floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f); floorBatch.Vertex3f(10.0f, -10.0f, z - 10.0f); } floorBatch.End(); ceilingBatch.Begin(GL_TRIANGLE_STRIP, 28, 1); for(z = 60.0f; z >= 0.0f; z -=10.0f) { ceilingBatch.MultiTexCoord2f(0, 0.0f, 1.0f); ceilingBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f); ceilingBatch.MultiTexCoord2f(0, 1.0f, 1.0f); ceilingBatch.Vertex3f(10.0f, 10.0f, z - 10.0f); ceilingBatch.MultiTexCoord2f(0, 0.0f, 0.0f); ceilingBatch.Vertex3f(-10.0f, 10.0f, z); ceilingBatch.MultiTexCoord2f(0, 1.0f, 0.0f); ceilingBatch.Vertex3f(10.0f, 10.0f, z); } ceilingBatch.End(); leftWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1); for(z = 60.0f; z >= 0.0f; z -=10.0f) { leftWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f); leftWallBatch.Vertex3f(-10.0f, -10.0f, z); leftWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f); leftWallBatch.Vertex3f(-10.0f, 10.0f, z); leftWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f); leftWallBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f); leftWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f); leftWallBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f); } leftWallBatch.End(); rightWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1); for(z = 60.0f; z >= 0.0f; z -=10.0f) { rightWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f); rightWallBatch.Vertex3f(10.0f, -10.0f, z); rightWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f); rightWallBatch.Vertex3f(10.0f, 10.0f, z); rightWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f); rightWallBatch.Vertex3f(10.0f, -10.0f, z - 10.0f); rightWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f); rightWallBatch.Vertex3f(10.0f, 10.0f, z - 10.0f); } rightWallBatch.End(); }
/////////////////////////////////////////////////////////////////////////////////////// // Make a cube, centered at the origin, and with a specified "radius" void gltMakeCube(GLBatch& cubeBatch, GLfloat fRadius ) { cubeBatch.Begin(GL_TRIANGLES, 36, 1); ///////////////////////////////////////////// // Top of cube cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); //////////////////////////////////////////// // Bottom of cube cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, -fRadius, fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, -fRadius, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); /////////////////////////////////////////// // Left side of cube cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(-fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, -fRadius, fRadius); // Right side of cube cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, fRadius, -fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); cubeBatch.Normal3f(fRadius, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); // Front and Back // Front cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, fRadius); cubeBatch.Normal3f(0.0f, 0.0f, fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, fRadius); // Back cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-fRadius, -fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, 0.0f, fRadius); cubeBatch.Vertex3f(-fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, fRadius); cubeBatch.Vertex3f(fRadius, fRadius, -fRadius); cubeBatch.Normal3f(0.0f, 0.0f, -fRadius); cubeBatch.MultiTexCoord2f(0, fRadius, 0.0f); cubeBatch.Vertex3f(fRadius, -fRadius, -fRadius); cubeBatch.End(); }
void SetupRenderingContext() { int i, j; // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); //glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.94f, 0.94f, 1.0f, 1.0f); // Blue Sky /* ------------- */ /* Scene objects */ track.SetupRenderingContext(); theWheel.SetupRenderingContext(); carousel.SetupRenderingContext(); unicorn.SetupRenderingContext(); ostrich.SetupRenderingContext(); turtle.SetupRenderingContext(); /* --------------- */ /* Make the ground */ GLfloat texSize = 50.0f; groundBatch.Begin(GL_TRIANGLE_FAN, 4, 1); groundBatch.MultiTexCoord2f(0, 0.0f, 0.0f); groundBatch.Vertex3f(-0.5f * FLOOR_GRID_WIDTH, FLOOR_HEIGHT, 0.5f * FLOOR_GRID_WIDTH); groundBatch.MultiTexCoord2f(0, texSize, 0.0f); groundBatch.Vertex3f(0.5f * FLOOR_GRID_WIDTH, FLOOR_HEIGHT, 0.5f * FLOOR_GRID_WIDTH); groundBatch.MultiTexCoord2f(0, texSize, texSize); groundBatch.Vertex3f(0.5f * FLOOR_GRID_WIDTH, FLOOR_HEIGHT, -0.5f * FLOOR_GRID_WIDTH); groundBatch.MultiTexCoord2f(0, 0.0f, texSize); groundBatch.Vertex3f(-0.5f * FLOOR_GRID_WIDTH, FLOOR_HEIGHT, -0.5f * FLOOR_GRID_WIDTH); groundBatch.End(); /* ------------------------------- */ /* Make texture object for ground. */ glGenTextures(1, &groundTexture); glBindTexture(GL_TEXTURE_2D, groundTexture); LoadBMPTexture(GROUND_TEXTURE_FILENAME, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); /* ----------------------------- */ /* Make texture objects for cap. */ glGenTextures(NBR_TEXTURE_SETS, capTexture); for ( i = 0; i < NBR_TEXTURE_SETS; i++ ) { glBindTexture(GL_TEXTURE_2D, capTexture[i]); LoadBMPTexture(CAP_TEXTURE_FILENAME[i], GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); } /* ------------------------------------------ */ /* Make texture objects for wheel components. */ glGenTextures(NBR_WHEEL_TEXTURES, wheelTexture); for ( i = 0; i < NBR_WHEEL_TEXTURES; i++ ) { glBindTexture(GL_TEXTURE_2D, wheelTexture[i]); LoadBMPTexture(WHEEL_TEXTURE_FILENAME[i], GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); } /* ------------------------------------------------ */ /* Make texture objects for Ferris wheel car walls. */ for ( i = 0; i < NBR_TEXTURE_SETS; i++ ) { glGenTextures(NBR_WALL_TEXTURES, wallTexture[i]); for ( j = 0; j < NBR_WALL_TEXTURES; j++ ) { glBindTexture(GL_TEXTURE_2D, wallTexture[i][j]); LoadBMPTexture(WALL_TEXTURE_FILENAME[i][j], GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); } } /* ---------------------------------------- */ /* Make texture objects for car components. */ glGenTextures(NBR_CAR_TEXTURES, carTexture); for ( i = 0; i < NBR_CAR_TEXTURES; i++ ) { glBindTexture(GL_TEXTURE_2D, carTexture[i]); LoadBMPTexture(CAR_TEXTURE_FILENAME[i], GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); } }
/////////////////////////////////////////////////////////////////////////////// // Make a cube out of a batch of triangles. Texture coordinates and normals // are also provided. void MakeCube(GLBatch& cubeBatch) { cubeBatch.Begin(GL_TRIANGLES, 36, 1); ///////////////////////////////////////////// // Top of cube cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); //////////////////////////////////////////// // Bottom of cube cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, -1.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); /////////////////////////////////////////// // Left side of cube cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(-1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f); // Right side of cube cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(1.0f, 0.0f, 0.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); // Front and Back // Front cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, 1.0f); cubeBatch.Normal3f(0.0f, 0.0f, 1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, 1.0f); // Back cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 0.0f); cubeBatch.Vertex3f(-1.0f, -1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 0.0f, 1.0f); cubeBatch.Vertex3f(-1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 1.0f); cubeBatch.Vertex3f(1.0f, 1.0f, -1.0f); cubeBatch.Normal3f(0.0f, 0.0f, -1.0f); cubeBatch.MultiTexCoord2f(0, 1.0f, 0.0f); cubeBatch.Vertex3f(1.0f, -1.0f, -1.0f); cubeBatch.End(); }
// This function does any needed initialization on the rendering // context. void SetupRC() { M3DVector3f vVerts[SMALL_STARS]; // SMALL_STARS is the largest batch we are going to need int i; shaderManager.InitializeStockShaders(); // Populate star list smallStarBatch.Begin(GL_POINTS, SMALL_STARS); for(i = 0; i < SMALL_STARS; i++) { vVerts[i][0] = (GLfloat)(rand() % SCREEN_X); vVerts[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100)) + 100.0f; vVerts[i][2] = 0.0f; } smallStarBatch.CopyVertexData3f(vVerts); smallStarBatch.End(); // Populate star list mediumStarBatch.Begin(GL_POINTS, MEDIUM_STARS); for(i = 0; i < MEDIUM_STARS; i++) { vVerts[i][0] = (GLfloat)(rand() % SCREEN_X); vVerts[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100)) + 100.0f; vVerts[i][2] = 0.0f; } mediumStarBatch.CopyVertexData3f(vVerts); mediumStarBatch.End(); // Populate star list largeStarBatch.Begin(GL_POINTS, LARGE_STARS); for(i = 0; i < LARGE_STARS; i++) { vVerts[i][0] = (GLfloat)(rand() % SCREEN_X); vVerts[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100)) + 100.0f; vVerts[i][2] = 0.0f; } largeStarBatch.CopyVertexData3f(vVerts); largeStarBatch.End(); M3DVector3f vMountains[12] = { 0.0f, 25.0f, 0.0f, 50.0f, 100.0f, 0.0f, 100.0f, 25.0f, 0.0f, 225.0f, 125.0f, 0.0f, 300.0f, 50.0f, 0.0f, 375.0f, 100.0f, 0.0f, 460.0f, 25.0f, 0.0f, 525.0f, 100.0f, 0.0f, 600.0f, 20.0f, 0.0f, 675.0f, 70.0f, 0.0f, 750.0f, 25.0f, 0.0f, 800.0f, 90.0f, 0.0f }; mountainRangeBatch.Begin(GL_LINE_STRIP, 12); mountainRangeBatch.CopyVertexData3f(vMountains); mountainRangeBatch.End(); // The Moon GLfloat x = 700.0f; // Location and radius of moon GLfloat y = 500.0f; GLfloat r = 50.0f; GLfloat angle = 0.0f; // Another looping variable moonBatch.Begin(GL_TRIANGLE_FAN, 34); int nVerts = 0; vVerts[nVerts][0] = x; vVerts[nVerts][1] = y; vVerts[nVerts][2] = 0.0f; for(angle = 0; angle < 2.0f * 3.141592f; angle += 0.2f) { nVerts++; vVerts[nVerts][0] = x + float(cos(angle)) * r; vVerts[nVerts][1] = y + float(sin(angle)) * r; vVerts[nVerts][2] = 0.0f; } nVerts++; vVerts[nVerts][0] = x + r;; vVerts[nVerts][1] = y; vVerts[nVerts][2] = 0.0f; moonBatch.CopyVertexData3f(vVerts); moonBatch.End(); // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); }
/////////////////////////////////////////////////////////////////////////////// // OpenGL related startup code is safe to put here. Load textures, etc. void SetupRC(void) { #ifndef ANGLE GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } #endif // Initialze Shader Manager shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); // Black glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gltMakeTorus(torusBatch, 0.4f, 0.15f, 35, 35); GLfloat alpha = 0.25f; floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 0.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, 20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 10.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(20.0f, -0.41f, -20.0f); floorBatch.Color4f(0.0f, 1.0f, 0.0f, alpha); floorBatch.MultiTexCoord2f(0, 0.0f, 10.0f); floorBatch.Normal3f(0.0, 1.0f, 0.0f); floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f); floorBatch.End(); glGenTextures(1, textures); glBindTexture(GL_TEXTURE_2D, textures[0]); LoadBMPTexture("marble.bmp", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_REPEAT); // Create blur program blurProg = gltLoadShaderPairWithAttributes("blur.vs", "blur.fs", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "texCoord0"); // Create blur textures glGenTextures(6, blurTextures); // XXX I don't think this is necessary. Should set texture data to NULL // Allocate a pixel buffer to initialize textures and PBOs pixelDataSize = screenWidth*screenHeight*3*sizeof(unsigned int); // XXX This should be unsigned byte void* data = (void*)malloc(pixelDataSize); memset(data, 0x00, pixelDataSize); // Setup 6 texture units for blur effect // Initialize texture data for (int i=0; i<6;i++) { glActiveTexture(GL_TEXTURE1+i); glBindTexture(GL_TEXTURE_2D, blurTextures[i]); #ifndef OPENGL_ES glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); #else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #endif glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenWidth, screenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, data); } // Alloc space for copying pixels so we dont call malloc on every draw #ifndef OPENGL_ES glGenBuffers(1, pixBuffObjs); glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]); glBufferData(GL_PIXEL_PACK_BUFFER, pixelDataSize, pixelData, GL_DYNAMIC_COPY); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); #endif // Create geometry and a matrix for screen aligned drawing gltGenerateOrtho2DMat(screenWidth, screenHeight, orthoMatrix, screenQuad); // Make sure all went well gltCheckErrors(); }
void MakePyramid(GLBatch& pyramidBatch) { pyramidBatch.Begin(GL_TRIANGLES, 18, 1); // Bottom of pyramid pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f); pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f); pyramidBatch.Vertex3f(-1.0f, -1.0f, -1.0f); pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f); pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f); pyramidBatch.Vertex3f(1.0f, -1.0f, -1.0f); pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f); pyramidBatch.MultiTexCoord2f(0, 1.0f, 1.0f); pyramidBatch.Vertex3f(1.0f, -1.0f, 1.0f); pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f); pyramidBatch.MultiTexCoord2f(0, 0.0f, 1.0f); pyramidBatch.Vertex3f(-1.0f, -1.0f, 1.0f); pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f); pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f); pyramidBatch.Vertex3f(-1.0f, -1.0f, -1.0f); pyramidBatch.Normal3f(0.0f, -1.0f, 0.0f); pyramidBatch.MultiTexCoord2f(0, 1.0f, 1.0f); pyramidBatch.Vertex3f(1.0f, -1.0f, 1.0f); M3DVector3f vApex = { 0.0f, 1.0f, 0.0f }; M3DVector3f vFrontLeft = { -1.0f, -1.0f, 1.0f }; M3DVector3f vFrontRight = { 1.0f, -1.0f, 1.0f }; M3DVector3f vBackLeft = { -1.0f, -1.0f, -1.0f }; M3DVector3f vBackRight = { 1.0f, -1.0f, -1.0f }; M3DVector3f n; // Front of Pyramid m3dFindNormal(n, vApex, vFrontLeft, vFrontRight); pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f); pyramidBatch.Vertex3fv(vApex); // Apex pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f); pyramidBatch.Vertex3fv(vFrontLeft); // Front left corner pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f); pyramidBatch.Vertex3fv(vFrontRight); // Front right corner m3dFindNormal(n, vApex, vBackLeft, vFrontLeft); pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f); pyramidBatch.Vertex3fv(vApex); // Apex pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f); pyramidBatch.Vertex3fv(vBackLeft); // Back left corner pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f); pyramidBatch.Vertex3fv(vFrontLeft); // Front left corner m3dFindNormal(n, vApex, vFrontRight, vBackRight); pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f); pyramidBatch.Vertex3fv(vApex); // Apex pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f); pyramidBatch.Vertex3fv(vFrontRight); // Front right corner pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f); pyramidBatch.Vertex3fv(vBackRight); // Back right cornder m3dFindNormal(n, vApex, vBackRight, vBackLeft); pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 0.5f, 1.0f); pyramidBatch.Vertex3fv(vApex); // Apex pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 0.0f, 0.0f); pyramidBatch.Vertex3fv(vBackRight); // Back right cornder pyramidBatch.Normal3fv(n); pyramidBatch.MultiTexCoord2f(0, 1.0f, 0.0f); pyramidBatch.Vertex3fv(vBackLeft); // Back left corner pyramidBatch.End(); }
// This function does any needed initialization on the rendering // context. void SetupRC() { M3DVector3f vVerts[SMALL_STARS]; // SMALL_STARS is the largest batch we are going to need int i; shaderManager.InitializeStockShaders(); // Populate star list smallStarBatch.Begin(GL_POINTS, SMALL_STARS); for(i = 0; i < SMALL_STARS; i++) { vVerts[i][0] = (GLfloat)(rand() % SCREEN_X); vVerts[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100)) + 100.0f; vVerts[i][2] = 0.0f; } smallStarBatch.CopyVertexData3f(vVerts); smallStarBatch.End(); // Populate star list mediumStarBatch.Begin(GL_POINTS, MEDIUM_STARS); for(i = 0; i < MEDIUM_STARS; i++) { vVerts[i][0] = (GLfloat)(rand() % SCREEN_X); vVerts[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100)) + 100.0f; vVerts[i][2] = 0.0f; } mediumStarBatch.CopyVertexData3f(vVerts); mediumStarBatch.End(); // Populate star list largeStarBatch.Begin(GL_POINTS, LARGE_STARS); for(i = 0; i < LARGE_STARS; i++) { vVerts[i][0] = (GLfloat)(rand() % SCREEN_X); vVerts[i][1] = (GLfloat)(rand() % (SCREEN_Y - 100)) + 100.0f; vVerts[i][2] = 0.0f; } largeStarBatch.CopyVertexData3f(vVerts); largeStarBatch.End(); M3DVector3f vMountains[12] = { 0.0f, 25.0f, 0.0f, 50.0f, 100.0f, 0.0f, 100.0f, 25.0f, 0.0f, 225.0f, 125.0f, 0.0f, 300.0f, 50.0f, 0.0f, 375.0f, 100.0f, 0.0f, 460.0f, 25.0f, 0.0f, 525.0f, 100.0f, 0.0f, 600.0f, 20.0f, 0.0f, 675.0f, 70.0f, 0.0f, 750.0f, 25.0f, 0.0f, 800.0f, 90.0f, 0.0f }; mountainRangeBatch.Begin(GL_LINE_STRIP, 12); mountainRangeBatch.CopyVertexData3f(vMountains); mountainRangeBatch.End(); // The Moon GLfloat x = 700.0f; // Location and radius of moon GLfloat y = 500.0f; GLfloat r = 50.0f; GLfloat angle = 0.0f; // Another looping variable moonBatch.Begin(GL_TRIANGLE_FAN, 4, 1); moonBatch.MultiTexCoord2f(0, 0.0f, 0.0f); moonBatch.Vertex3f(x - r, y - r, 0.0f); moonBatch.MultiTexCoord2f(0, 1.0f, 0.0f); moonBatch.Vertex3f(x + r, y - r, 0.0f); moonBatch.MultiTexCoord2f(0, 1.0f, 1.0f); moonBatch.Vertex3f(x + r, y + r, 0.0f); moonBatch.MultiTexCoord2f(0, 0.0f, 1.0f); moonBatch.Vertex3f(x - r, y + r, 0.0f); moonBatch.End(); // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); // Turn on line antialiasing, and give hint to do the best // job possible. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); starFieldShader = gltLoadShaderPairWithAttributes("StarField.vp", "StarField.fp", 1, GLT_ATTRIBUTE_VERTEX, "vVertex"); locMVP = glGetUniformLocation(starFieldShader, "mvpMatrix"); locStarTexture = glGetUniformLocation(starFieldShader, "starImage"); moonShader = gltLoadShaderPairWithAttributes("MoonShader.vp", "MoonShader.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "vTexCoords"); locMoonMVP = glGetUniformLocation(moonShader, "mvpMatrix"); locMoonTexture = glGetUniformLocation(moonShader, "moonImage"); locMoonTime = glGetUniformLocation(moonShader, "fTime"); glGenTextures(1, &starTexture); glBindTexture(GL_TEXTURE_2D, starTexture); LoadTGATexture("Star.tga", GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); glGenTextures(1, &moonTexture); glBindTexture(GL_TEXTURE_2D_ARRAY, moonTexture); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 64, 64, 30, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); for(int i = 0; i < 29; i++) { char cFile[32]; sprintf(cFile, "moon%02d.tga", i); GLbyte *pBits; int nWidth, nHeight, nComponents; GLenum eFormat; // Read the texture bits pBits = gltReadTGABits(cFile, &nWidth, &nHeight, &nComponents, &eFormat); glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, nWidth, nHeight, 1, GL_BGRA, GL_UNSIGNED_BYTE, pBits); free(pBits); } }