/////////////////////////////////////////////////////////////////////////////// // 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"); }
/** * 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.init(); // 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(); myTexturedIdentityShader = gltLoadShaderWithFileEx("TextureIndentity.vp", "TextureIndentity.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_TEXTURE0, "vTexCoords"); glGenTextures(1, &textureId); glBindTexture(GL_TEXTURE_2D, textureId); gltLoadTextureTGA("stone.tga", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); }
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"); }
// 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 ); }
// 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); } }
/////////////////////////////////////////////////////////////////////////////// // 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.7f, 0.7f, 0.7f, 1.0f ); shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix); cameraFrame.MoveForward(-15.0f); ////////////////////////////////////////////////////////////////////// // Some points, more or less in the shape of Florida GLfloat vCoast[24][3] = {{2.80, 1.20, 0.0 }, {2.0, 1.20, 0.0 }, {2.0, 1.08, 0.0 }, {2.0, 1.08, 0.0 }, {0.0, 0.80, 0.0 }, {-.32, 0.40, 0.0 }, {-.48, 0.2, 0.0 }, {-.40, 0.0, 0.0 }, {-.60, -.40, 0.0 }, {-.80, -.80, 0.0 }, {-.80, -1.4, 0.0 }, {-.40, -1.60, 0.0 }, {0.0, -1.20, 0.0 }, { .2, -.80, 0.0 }, {.48, -.40, 0.0 }, {.52, -.20, 0.0 }, {.48, .20, 0.0 }, {.80, .40, 0.0 }, {1.20, .80, 0.0 }, {1.60, .60, 0.0 }, {2.0, .60, 0.0 }, {2.2, .80, 0.0 }, {2.40, 1.0, 0.0 }, {2.80, 1.0, 0.0 }}; // Load point batch pointBatch.Begin(GL_POINTS, 24); pointBatch.CopyVertexData3f(vCoast); pointBatch.End(); // Load as a bunch of line segments lineBatch.Begin(GL_LINES, 24); lineBatch.CopyVertexData3f(vCoast); lineBatch.End(); // Load as a single line segment lineStripBatch.Begin(GL_LINE_STRIP, 24); lineStripBatch.CopyVertexData3f(vCoast); lineStripBatch.End(); // Single line, connect first and last points lineLoopBatch.Begin(GL_LINE_LOOP, 24); lineLoopBatch.CopyVertexData3f(vCoast); lineLoopBatch.End(); // For Triangles, we'll make a Pyramid GLfloat vPyramid[12][3] = { -2.0f, 0.0f, -2.0f, 2.0f, 0.0f, -2.0f, 0.0f, 4.0f, 0.0f, 2.0f, 0.0f, -2.0f, 2.0f, 0.0f, 2.0f, 0.0f, 4.0f, 0.0f, 2.0f, 0.0f, 2.0f, -2.0f, 0.0f, 2.0f, 0.0f, 4.0f, 0.0f, -2.0f, 0.0f, 2.0f, -2.0f, 0.0f, -2.0f, 0.0f, 4.0f, 0.0f}; triangleBatch.Begin(GL_TRIANGLES, 12); triangleBatch.CopyVertexData3f(vPyramid); triangleBatch.End(); // For a Triangle fan, just a 6 sided hex. Raise the center up a bit GLfloat vPoints[100][3]; // Scratch array, more than we need int nVerts = 0; GLfloat r = 3.0f; vPoints[nVerts][0] = 0.0f; vPoints[nVerts][1] = 0.0f; vPoints[nVerts][2] = 0.0f; for(GLfloat angle = 0; angle < M3D_2PI; angle += M3D_2PI / 6.0f) { nVerts++; vPoints[nVerts][0] = float(cos(angle)) * r; vPoints[nVerts][1] = float(sin(angle)) * r; vPoints[nVerts][2] = -0.5f; } // Close the fan nVerts++; vPoints[nVerts][0] = r; vPoints[nVerts][1] = 0; vPoints[nVerts][2] = 0.0f; // Load it up triangleFanBatch.Begin(GL_TRIANGLE_FAN, 8); triangleFanBatch.CopyVertexData3f(vPoints); triangleFanBatch.End(); // For triangle strips, a little ring or cylinder segment int iCounter = 0; GLfloat radius = 3.0f; for(GLfloat angle = 0.0f; angle <= (2.0f*M3D_PI); angle += 0.3f) { GLfloat x = radius * sin(angle); GLfloat y = radius * cos(angle); // Specify the point and move the Z value up a little vPoints[iCounter][0] = x; vPoints[iCounter][1] = y; vPoints[iCounter][2] = -0.5; iCounter++; vPoints[iCounter][0] = x; vPoints[iCounter][1] = y; vPoints[iCounter][2] = 0.5; iCounter++; } // Close up the loop vPoints[iCounter][0] = vPoints[0][0]; vPoints[iCounter][1] = vPoints[0][1]; vPoints[iCounter][2] = -0.5; iCounter++; vPoints[iCounter][0] = vPoints[1][0]; vPoints[iCounter][1] = vPoints[1][1]; vPoints[iCounter][2] = 0.5; iCounter++; // Load the triangle strip triangleStripBatch.Begin(GL_TRIANGLE_STRIP, iCounter); triangleStripBatch.CopyVertexData3f(vPoints); triangleStripBatch.End(); }
void SetupRC() { glClearColor(0.7f, 0.7f, 0.7f, 1.0f ); shaderManager.InitializeStockShaders(); glEnable(GL_DEPTH_TEST); transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix); cameraFrame.MoveForward(-15.0f); // 一组图元顶点——长得像佛罗里达州 GLfloat vCoast[24][3] = { {2.80, 1.20, 0.0 }, {2.0, 1.20, 0.0 }, {2.0, 1.08, 0.0 }, {2.0, 1.08, 0.0 }, {0.0, 0.80, 0.0 }, {-.32, 0.40, 0.0 }, {-.48, 0.2, 0.0 }, {-.40, 0.0, 0.0 }, {-.60, -.40, 0.0 }, {-.80, -.80, 0.0 }, {-.80, -1.4, 0.0 }, {-.40, -1.60, 0.0 }, {0.0, -1.20, 0.0 }, { .2, -.80, 0.0 }, {.48, -.40, 0.0 }, {.52, -.20, 0.0 }, {.48, .20, 0.0 }, {.80, .40, 0.0 }, {1.20, .80, 0.0 }, {1.60, .60, 0.0 }, {2.0, .60, 0.0 }, {2.2, .80, 0.0 }, {2.40, 1.0, 0.0 }, {2.80, 1.0, 0.0 } }; // 点批次 pointBatch.Begin(GL_POINTS, 24); pointBatch.CopyVertexData3f(vCoast); pointBatch.End(); // 线段批次 lineBatch.Begin(GL_LINES, 24); lineBatch.CopyVertexData3f(vCoast); lineBatch.End(); // 线批次 lineStripBatch.Begin(GL_LINE_STRIP, 24); lineStripBatch.CopyVertexData3f(vCoast); lineStripBatch.End(); // 循环线批次 lineLoopBatch.Begin(GL_LINE_LOOP, 24); lineLoopBatch.CopyVertexData3f(vCoast); lineLoopBatch.End(); GLfloat vPyramid[12][3] = { -2.0f, 0.0f, -2.0f, 2.0f, 0.0f, -2.0f, 0.0f, 4.0f, 0.0f, 2.0f, 0.0f, -2.0f, 2.0f, 0.0f, 2.0f, 0.0f, 4.0f, 0.0f, 2.0f, 0.0f, 2.0f, -2.0f, 0.0f, 2.0f, 0.0f, 4.0f, 0.0f, -2.0f, 0.0f, 2.0f, -2.0f, 0.0f, -2.0f, 0.0f, 4.0f, 0.0f }; triangleBatch.Begin(GL_TRIANGLES, 12); triangleBatch.CopyVertexData3f(vPyramid); triangleBatch.End(); GLfloat vPoints[100][3]; int nVerts = 0; GLfloat r = 3.0f; vPoints[nVerts][0] = 0.0f; vPoints[nVerts][1] = 0.0f; vPoints[nVerts][2] = 0.0f; for(GLfloat angle = 0; angle < M3D_2PI; angle += M3D_2PI / 6.0f) { nVerts++; vPoints[nVerts][0] = float(cos(angle)) * r; vPoints[nVerts][1] = float(sin(angle)) * r; vPoints[nVerts][2] = -0.5f; } nVerts++; vPoints[nVerts][0] = r; vPoints[nVerts][1] = 0; vPoints[nVerts][2] = 0.0f; triangleFanBatch.Begin(GL_TRIANGLE_FAN, 8); triangleFanBatch.CopyVertexData3f(vPoints); triangleFanBatch.End(); int iCounter = 0; GLfloat radius = 3.0f; for(GLfloat angle = 0.0f; angle <= (2.0f * M3D_PI); angle += 0.3f) { GLfloat x = radius * sin(angle); GLfloat y = radius * cos(angle); vPoints[iCounter][0] = x; vPoints[iCounter][1] = y; vPoints[iCounter][2] = -0.5; iCounter++; vPoints[iCounter][0] = x; vPoints[iCounter][1] = y; vPoints[iCounter][2] = 0.5; iCounter++; } vPoints[iCounter][0] = vPoints[0][0]; vPoints[iCounter][1] = vPoints[0][1]; vPoints[iCounter][2] = -0.5; iCounter++; vPoints[iCounter][0] = vPoints[1][0]; vPoints[iCounter][1] = vPoints[1][1]; vPoints[iCounter][2] = 0.5; iCounter++; triangleStripBatch.Begin(GL_TRIANGLE_STRIP, iCounter); triangleStripBatch.CopyVertexData3f(vPoints); triangleStripBatch.End(); }
void CreateSphere(float xShift, float yShift, float zShift) { float radius = 50.0f * scale; float diameter = radius * 2; GLfloat x, z; M3DVector3f* bodyVertices = new M3DVector3f[sphereArraySize * 2]; M3DVector4f* bodyColors = new M3DVector4f[sphereArraySize * 2]; m3dLoadVector3(bodyVertices[0], xShift, radius - diameter/tesselation + yShift, zShift); m3dLoadVector3(bodyVertices[1], 0.0f + xShift, radius - 2*diameter/tesselation + yShift, zShift); m3dLoadVector4(bodyColors[0], 0.91f, 0.70f, 0.54f, 1.0f); m3dLoadVector4(bodyColors[1], 0.91f, 0.70f, 0.54f, 1.0f); int i = 1; int colorIndex = 0; // Kugel vertikal entlang der Breitengrade durchlaufen for (GLfloat latitude = 0.0f; latitude <= GL_PI; latitude += (GL_PI / tesselation)) { float sliceRadius = radius * sin(latitude); GLfloat y = radius * cos(latitude) + yShift; // Kugelscheibe entlang der Laengengrade durchlaufen for (GLfloat longitude = 0.0f; longitude <= (2.0f*GL_PI); longitude += (GL_PI / tesselation)) { float upperRadius = sliceRadius; float lowerRadius = radius * sin(latitude + (GL_PI / tesselation)); x = cos(longitude); z = sin(longitude); m3dLoadVector3(bodyVertices[2 * i], x*upperRadius + xShift, y, z*upperRadius + zShift); m3dLoadVector3(bodyVertices[2 * i + 1], x*lowerRadius + xShift, radius * cos(latitude + GL_PI/tesselation), z*lowerRadius + zShift); //fuer Abgabe einkommentieren :) //if (colorIndex % 2 == 0) { // m3dLoadVector4(bodyColors[2 * i], 1.0f, 0.8f, 0.2f, 1.0f); // m3dLoadVector4(bodyColors[2 * i + 1], 1.0f, 0.8f, 0.2f, 1.0f); //} //else { // m3dLoadVector4(bodyColors[2 * i], 0.235f, 0.235f, 0.235f, 1.0f); // m3dLoadVector4(bodyColors[2 * i + 1], 0.235f, 0.235f, 0.235f, 1.0f); //} // fuer Maennchen einkommentieren :) m3dLoadVector4(bodyColors[2 * i], 0.91f, 0.70f, 0.54f, 1.0f); m3dLoadVector4(bodyColors[2 * i + 1], 0.91f, 0.70f, 0.54f, 1.0f); i++; } colorIndex++; } sphereBody.Reset(); sphereBody.Begin(GL_TRIANGLE_STRIP, sphereArraySize); sphereBody.CopyVertexData3f(bodyVertices); sphereBody.CopyColorData4f(bodyColors); sphereBody.End(); delete[] bodyVertices; delete[] bodyColors; }
void CreateCylinder(float xShift, float yShift, float zShift) { GLfloat x, z, angle; float radius = 50.0f * scale; int i = 1; M3DVector3f* fussVertices = new M3DVector3f[arraySize]; M3DVector3f* kopfVertices = new M3DVector3f[arraySize]; M3DVector3f* planeVertices = new M3DVector3f[doubleArraySize]; M3DVector4f* fussColors = new M3DVector4f[arraySize]; M3DVector4f* kopfColors = new M3DVector4f[arraySize]; M3DVector4f* planeColors = new M3DVector4f[doubleArraySize]; m3dLoadVector3(fussVertices[0], xShift, -radius + yShift, zShift); m3dLoadVector3(kopfVertices[0], xShift, radius + yShift, zShift); m3dLoadVector3(planeVertices[0], xShift, -radius + yShift, zShift); m3dLoadVector3(planeVertices[1], xShift, radius + yShift, zShift); m3dLoadVector4(fussColors[0], 0.0f, 0.7f, 0.0f, 1); m3dLoadVector4(kopfColors[0], 0.0f, 0.5f, 0.1f, 1); m3dLoadVector4(planeColors[0], 0.1f, 0.3f, 0.0f, 1); m3dLoadVector4(planeColors[1], 0.1f, 0.3f, 0.0f, 1); for (angle = 0.0f; angle <= (2.0f*GL_PI); angle += (GL_PI / tesselation)) { // Berechne x und y Positionen des naechsten Vertex x = radius*sin(angle); z = radius*cos(angle); m3dLoadVector3(fussVertices[i], x + xShift, -radius + yShift, z + zShift); m3dLoadVector3(kopfVertices[i], -x, radius + yShift, z + zShift); m3dLoadVector3(planeVertices[2 * i], x + xShift, -radius + yShift, z + zShift); m3dLoadVector3(planeVertices[2 * i + 1], x + xShift, radius + yShift, z + zShift); m3dLoadVector4(fussColors[i], 0.0f, 0.7f, 0.0f, 1.0f); m3dLoadVector4(kopfColors[i], 0.0f, 0.5f, 0.1f, 1.0f); m3dLoadVector4(planeColors[2 * i], 0.1f, 0.3f, 0.0f, 1.0f); m3dLoadVector4(planeColors[2 * i + 1], 0.1f, 0.3f, 0.0f, 1.0f); i++; } fuss.Begin(GL_TRIANGLE_FAN, arraySize); kopf.Begin(GL_TRIANGLE_FAN, arraySize); plane.Begin(GL_TRIANGLE_STRIP, doubleArraySize); fuss.CopyVertexData3f(fussVertices); fuss.CopyColorData4f(fussColors); kopf.CopyVertexData3f(kopfVertices); kopf.CopyColorData4f(kopfColors); plane.CopyVertexData3f(planeVertices); plane.CopyColorData4f(planeColors); fuss.End(); kopf.End(); plane.End(); delete[] fussVertices; delete[] fussColors; delete[] kopfVertices; delete[] kopfColors; delete[] planeVertices; delete[] planeColors; }
void CreateCone(float xShift, float yShift, float zShift) { //18 Vertices anlegen M3DVector3f* konusVertices = new M3DVector3f[18]; M3DVector4f* konusColors = new M3DVector4f[18]; float radius = 50.0f * scale; float height = 75.0f * scale; // Die Spitze des Konus ist ein Vertex, den alle Triangles gemeinsam haben; // um einen Konus anstatt einen Kreis zu produzieren muss der Vertex einen positiven z-Wert haben m3dLoadVector3(konusVertices[0], xShift, height + yShift, zShift); m3dLoadVector4(konusColors[0], 0.0f, 1.0f, 0.0f, 1.0f); // Kreise um den Mittelpunkt und spezifiziere Vertices entlang des Kreises // um einen Triangle_Fan zu erzeugen int iPivot = 1; int i = 1; for (float angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI / 8)) { // Berechne x und y Positionen des naechsten Vertex float x = radius*cos(angle); float z = radius*sin(angle); // Alterniere die Farbe zwischen Rot und Gruen if ((iPivot % 2) == 0) m3dLoadVector4(konusColors[i],0.9f, 1.0f, 0.9f, 1.0f); else m3dLoadVector4(konusColors[i], 0.0f, 0.4f, 0.2f, 1.0f); // Inkrementiere iPivot um die Farbe beim naechsten mal zu wechseln iPivot++; // Spezifiziere den naechsten Vertex des Triangle_Fans m3dLoadVector3(konusVertices[i], x + xShift, yShift, z + zShift); i++; } konus.Begin(GL_TRIANGLE_FAN, 18); konus.CopyVertexData3f(konusVertices); konus.CopyColorData4f(konusColors); konus.End(); delete[] konusVertices; delete[] konusColors; // Erzeuge einen weiteren Triangle_Fan um den Boden zu bedecken M3DVector3f* bodenVertices = new M3DVector3f[18]; M3DVector4f* bodenColors = new M3DVector4f[18]; // Das Zentrum des Triangle_Fans ist im Ursprung m3dLoadVector3(bodenVertices[0], 0, 0, zShift); m3dLoadVector4(bodenColors[0], 1, 0, 0, 1); i = 1; for (float angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI / 8)) { // Berechne x und y Positionen des naechsten Vertex float x = radius*sin(angle); float z = radius*cos(angle); m3dLoadVector4(bodenColors[i], 0.0f, 0.2f, 0.0f, 1.0f); // Inkrementiere iPivot um die Farbe beim naechsten mal zu wechseln iPivot++; // Spezifiziere den naechsten Vertex des Triangle_Fans m3dLoadVector3(bodenVertices[i], x + xShift, yShift, z + zShift); i++; } kboden.Begin(GL_TRIANGLE_FAN, 18); kboden.CopyVertexData3f(bodenVertices); kboden.CopyColorData4f(bodenColors); kboden.End(); delete[] bodenVertices; delete[] bodenColors; }
// 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; #ifndef OPENGL_ES glEnable(GL_POINT_SPRITE); #endif shaderManager.InitializeStockShaders(); // A number of shipping drivers are not conformant to the current OpenGL // spec and require this. NVidia... in particular. The OpenGL specification // states that this is always "on", in fact you can't enable or disable it // anymore. Adding this lines "fixes" this on non-conformant drivers, but // be aware, if you have a pure core (and working correctly) GL context, //you should not do this #ifndef OPENGL_ES glEnable(GL_POINT_SPRITE); #endif // 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); #ifndef OPENGL_ES glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); #endif starFieldShader = gltLoadShaderPairWithAttributes("StarField.vp", "StarField.fp", 1, GLT_ATTRIBUTE_VERTEX, "vVertex"); locMVP = glGetUniformLocation(starFieldShader, "mvpMatrix"); locStarTexture = glGetUniformLocation(starFieldShader, "starImage"); #ifdef OPENGL_ES locPointSize = glGetUniformLocation(starFieldShader, "fPointSize"); #endif 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); #ifndef OPENGL_ES 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); } #else glGenTextures(29, moonTextures); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); for(int i = 0; i < 29; i++) { char cFile[32]; sprintf(cFile, "moon%02d.tga", i); glBindTexture(GL_TEXTURE_2D, moonTextures[i]); LoadTGATexture(cFile, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); } #endif }