// A couple thoughts on sphere drawing: // 1) You need more slices than stacks, but little less than 2:1 // 2) At low LOD, setting stacks to an odd number avoids a "band" around the equator, making things look smoother void LLRenderSphere::prerender() { // Create a series of display lists for different LODs mDList[0] = glGenLists(1); glNewList(mDList[0], GL_COMPILE); drawSolidSphere(1.0, 30, 20); glEndList(); mDList[1] = glGenLists(1); glNewList(mDList[1], GL_COMPILE); drawSolidSphere(1.0, 20, 15); glEndList(); mDList[2] = glGenLists(1); glNewList(mDList[2], GL_COMPILE); drawSolidSphere(1.0, 12, 8); glEndList(); mDList[3] = glGenLists(1); glNewList(mDList[3], GL_COMPILE); drawSolidSphere(1.0, 8, 5); glEndList(); }
/* ---------------------------------------------------------- */ static void redraw(void) { GLfloat colorwhite [] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat light_position[4]={cos(M_PI/4)*(distance+1),0.0,sin(M_PI/4)*(distance+1),1}; glClearColor(0,0.4f,1,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( cos(M_PI/4)*(distance+1),0.0,sin(M_PI/4)*(distance+1), 0.0,0.0,0.9, 0.0,0.0,1.0); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); glLightfv(GL_LIGHT0, GL_DIFFUSE, colorwhite ); glEnable (GL_LIGHT0); glEnable(GL_LIGHTING); glPushMatrix(); glDisable(GL_LIGHTING); glBegin(GL_LINES); glColor3f(1,0,0);glVertex3f(0,0,0);glVertex3f(2,0,0); glColor3f(0,1,0);glVertex3f(0,0,0);glVertex3f(0,2,0); glColor3f(0,0,1);glVertex3f(0,0,0);glVertex3f(0,0,2); glEnd(); glRotatef(angley,0,1,0); glBindTexture(GL_TEXTURE_2D,textures[curtexture]); glEnable(GL_TEXTURE_2D); glColor3f(1,1,1); glEnable(GL_LIGHTING); glEnable( GL_POLYGON_OFFSET_FILL ); glPolygonOffset(1,1); drawSolidSphere(1,64,64); glDisable(GL_TEXTURE_2D); glDisable( GL_POLYGON_OFFSET_FILL ); glPopMatrix(); glutSwapBuffers(); }