glutSolidSphere无法着色

时间:2019-05-04 21:11:01

标签: opengl glut freeglut opengl-compat

我正在恢复10年前的一些openGL / glutcode。看起来freeglut已从glut手中接管了,有些情况并不完全相同。这段代码用来给球体上色:

void DrawRider() {
    glDisable(GL_TEXTURE_2D);
    glMatrixMode(GL_MODELVIEW);
    glColor4f(1.0, 0.6, 0.4, 0.5);
    glutSolidSphere(0.5, 12, 6);
}

现在,球体是黑色的,尽管它显示出一些发光的迹象。 enter image description here

这是设置代码:

void init (void) {
    glEnable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //GL_ONE_MINUS_SRC_ALPHA
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glShadeModel(GL_SMOOTH);    
    glFrontFace(GL_CCW);

    glEnable(GL_TEXTURE_2D);
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);

    if (transparent) glEnable(GL_BLEND);

    glColor3f(1.0,1.0,1.0);

    gCameraReset();

    glPolygonOffset (1.0, 1.0);
    SetLighting(4);
    glEnable(GL_LIGHTING);
}

这是调用DrawRider的显示代码:

void maindisplay(void)
{
    if (textured) glEnable(GL_TEXTURE_2D);
    else glDisable(GL_TEXTURE_2D);

    if (transparent) glDepthMask(0);
    else glDepthMask(1);

    if (!riding) {
        // track ball rotation
        glRotatef (gTrackBallRotation[0], gTrackBallRotation[1], gTrackBallRotation[2], gTrackBallRotation[3]);
        glRotatef (gWorldRotation[0], gWorldRotation[1], gWorldRotation[2], gWorldRotation[3]);
    }

    glClearColor (0.2f, 0.2f, 0.2f, 1.0f);  // defines the "background" color
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    // clear the surface

    if (!riding) DrawRider();   

    glutSwapBuffers();
}

1 个答案:

答案 0 :(得分:0)

启用客户端功能(glEnableClientState)与glutSolidSphere冲突。如果启用了客户端状态GL_COLOR_ARRAY,则尝试从glColorPointer设置的固定属性数组中读取颜色,而不是使用{{3}设置的当前颜色}。
没有充分的理由启用客户端功能。如果您要绘制自己的几何图形,例如glColor,则只需要它。

删除使客户端能够解决问题的状态:

void init (void) {
    glEnable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    //glEnableClientState(GL_COLOR_ARRAY);  <---- delete
    //glEnableClientState(GL_VERTEX_ARRAY);

    // ...
}

请注意,如果启用了客户端功能并调用了glutSolidSphere,则不清楚发生什么情况。可能这取决于glut库(glDrawArraysfreeglut)及其版本。