我照例子上画了个球是可以的,但是我画的线为什么就没有光照效果呢,代码如下
GLfloat mat_ambient[]= { 0.8, 0.8, 0.8, 1.0 };
GLfloat mat_diffuse[]= { 1.0, 0.0, 0.0, 0.0 };/* 红色 */
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 100.0 };
GLfloat light_diffuse[]= { 1.0, 1.0, 1.0, 0.0};/* 白色 */
GLfloat light_position[] = { 0.0, 0.0, 1.0, 0.0 };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
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);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST); ::glClearColor(1.0, 1.0, 1.0, 0.0);
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
CRect rect;
GetClientRect(rect);
int w = rect.Width(), h = rect.Height();
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
auxSolidSphere(1.0);#if 1
float size=100.0f;
glLineWidth(30.0f); //
// axis -- x
glColor3f(1,0,0);
glBegin(GL_LINES);
glVertex3f(-1,0,0);
glVertex3f(1,0,0);
glEnd();
// axis -- y
glColor3f(0,1,0);
glBegin(GL_LINES);
glVertex3f(0,-1,0);
glVertex3f(0,1,0);
glEnd();
// axis -- z
glColor3f(0,0,1);
glBegin(GL_LINES);
glVertex3f(0,0,-1);
glVertex3f(0,0,1);
glEnd();#endif
// ::glFinish();
glFlush();
SwapBuffers( m_hDC );
如果把画球注释掉的话,线条的颜色就变成红色了,但还是没有光照效果
GLfloat mat_ambient[]= { 0.8, 0.8, 0.8, 1.0 };
GLfloat mat_diffuse[]= { 1.0, 0.0, 0.0, 0.0 };/* 红色 */
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 100.0 };
GLfloat light_diffuse[]= { 1.0, 1.0, 1.0, 0.0};/* 白色 */
GLfloat light_position[] = { 0.0, 0.0, 1.0, 0.0 };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
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);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST); ::glClearColor(1.0, 1.0, 1.0, 0.0);
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
CRect rect;
GetClientRect(rect);
int w = rect.Width(), h = rect.Height();
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
auxSolidSphere(1.0);#if 1
float size=100.0f;
glLineWidth(30.0f); //
// axis -- x
glColor3f(1,0,0);
glBegin(GL_LINES);
glVertex3f(-1,0,0);
glVertex3f(1,0,0);
glEnd();
// axis -- y
glColor3f(0,1,0);
glBegin(GL_LINES);
glVertex3f(0,-1,0);
glVertex3f(0,1,0);
glEnd();
// axis -- z
glColor3f(0,0,1);
glBegin(GL_LINES);
glVertex3f(0,0,-1);
glVertex3f(0,0,1);
glEnd();#endif
// ::glFinish();
glFlush();
SwapBuffers( m_hDC );
如果把画球注释掉的话,线条的颜色就变成红色了,但还是没有光照效果
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
你可以把第一个参数调整一下,看那个合适,我没试过
if(m_bInit)
{
::glRotatef( 90.0, 1.0f, 0.0f, 0.0f );
m_bInit = FALSE;
}
第一次执行时m_bInit=TRUE,但是当你改变窗口大小时,m_bInit=FALSE。此时不执行::glRotatef( 90.0, 1.0f, 0.0f, 0.0f );了,所画的圆柱和下面的圆都不在可视范围内了,所以只剩下一个圆了。你可以把m_bInit = FALSE;注释掉 ,再改变一下窗口大小,就没问题了。