我照例子上画了个球是可以的,但是我画的线为什么就没有光照效果呢,代码如下
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 ); 
如果把画球注释掉的话,线条的颜色就变成红色了,但还是没有光照效果

解决方案 »

  1.   

    在前面加一句
    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
    你可以把第一个参数调整一下,看那个合适,我没试过
      

  2.   

    二维的线应该能用光照的,要不你把整个工程发给我看看,看我能解决吗。[email protected]
      

  3.   

    多谢happy2007,我现在改用曲面了,您要有兴趣的话,把曲面那段代码改成直线看看,我现在有了新的问题,在SIZE发生改变的时候,图形也发生变化了,刚开始是两个球和一个圆柱组成的一个三维管道,最大化之后就变成一个球了,并没有按照OnDraw里的代码执行,你帮我看看这个吧,我发给你
      

  4.   

    我知道问题出在哪了,
    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;注释掉 ,再改变一下窗口大小,就没问题了。