Hello, Everyone,

I'am a beginner in OpenGL. Recently I encounter a confuse problem about OpenGL's lighting.

I write a small program in C++ that rendering a triangle mesh, the program is just simple, get

every triangle's vertex position, compute its normal vector, then render it. Following is my code:

void OpenGLTests::Rendering() { GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; GLfloat light_position[] = { 0.0, 0.0, -1.0, 0.0 }; glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); //Draw the mesh glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_DOUBLE, 0, m_pPoints); glBegin(GL_TRIANGLES); for ( unsigned int i = 0; i < m_nTriangleCount; ++i) { unsigned int vs[3] = {m_pTriangleArray[3*i], m_pTriangleArray[3*i+1], m_pTriangleArray[3*i+2]}; //Get this trangle's points CPoint pt1(m_pPoints[vs[0]].xyz[0],m_pPoints[vs[0]].xyz[1],m_pPoints[vs[0]].xyz[2]) ; CPoint pt2(m_pPoints[vs[1]].xyz[0],m_pPoints[vs[1]].xyz[1],m_pPoints[vs[1]].xyz[2]); CPoint pt3(m_pPoints[vs[2]].xyz[0],m_pPoints[vs[2]].xyz[1],m_pPoints[vs[2]].xyz[2]); //if ( pt1.x <= 0 || pt2.x <= 0 || pt3.x <= 0 ) // continue; //Compute this triangle's normal CVector v1(pt2.x-pt1.x, pt2.y-pt1.y, pt2.z-pt1.z); CVector v2(pt3.x-pt1.x, pt3.y-pt1.y, pt3.z-pt1.z); CVector vn = VectorCrossProduct1(v2, v1); VectorNormalize(vn); glNormal3d(vn.x, vn.y, vn.z); //double dx = abs(pt1.x)+abs(pt2.x)+abs(pt3.x)/3; //double dy = abs(pt1.y)+abs(pt2.y)+abs(pt3.y)/3; //double dz = abs(pt1.z)+abs(pt2.z)+abs(pt3.z)/3; //double d = dx+dy+dz; //glColor4d(dx/d,dy/d,dz/d, 0); glArrayElement(vs[0]); glArrayElement(vs[1]); glArrayElement(vs[2]); } glEnd(); }

When I render the whole mesh, It looks like this picture:

It seems that have many black areas.

When I render the front part(triangles whose Z coordinate is greater than 0, just uncomment the red code ) of the mesh only,

It seems that everything is OK, But once I rotate the mesh, those black areas will emerge

again, see this picture:

My problem is why those black areas emerge? I'm sure the normal vector of every triangle

is computed correctly. Anyone can help me? thanks .