OpenGL着色不起作用。对象看起来是纯色的

时间:2012-05-21 07:15:38

标签: opengl glut lighting

我目前正在尝试进入OpenGL着色和照明以在简单的GLUT窗口中显示从Blender导出的3D模型。

我尝试显示典型的glutSolidTeapot来验证我的OpenGL设置。 随着茶壶的一切看起来非常精细,如下图所示。

enter image description here

如果我现在想用我自己的Blender导出模型替换茶壶,则阴影不起作用。模型(汽车轮辋)看起来很纯色。 旋转模型时颜色会发生变化,但颜色始终保持稳定。

enter image description here

glutSolidTeapot在引擎盖下做了什么来绘制茶壶模型?

这是我用来设置OpenGL的代码:

void SetupRC()
{
    glClearColor(0.4, 0.4, 0.4, 1.0);

    // Enable lighting and the light we have set up
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);

    //Set lighting parameters
    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
    glLightfv(GL_LIGHT0, GL_AMBIENT,light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // Enable shading
    glShadeModel(GL_SMOOTH);

    // Set up the projection parameters
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 20.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_AUTO_NORMAL);
    glEnable(GL_NORMALIZE);
}

重绘帧的代码:

void RenderScene(void)
{
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);

    glTranslatef(0.0, 0.0, -2.5f);

    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // set input data to arrays
    glVertexPointer(3, GL_FLOAT, 0, BlenderGuru_CarWheelVerts);

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    GLfloat ambConst[] = { 0.24725, 0.1995, 0.0745, 1.0};
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambConst);

    GLfloat diffConst[] = { 0.75164, 0.60648, 0.22648, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffConst);

    GLfloat specConst[] = { 0.628281, 0.555802, 0.366065, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specConst);

    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 51.2);

    // draw data
    glEnableClientState(GL_VERTEX_ARRAY);
        glDrawArrays(GL_TRIANGLES, 0, BlenderGuru_CarWheelNumVerts);
    glDisableClientState(GL_VERTEX_ARRAY);

    glFlush();
}

2 个答案:

答案 0 :(得分:4)

由于您是从Blender导出的,因此导出的数据很可能也包含法线。如果没有,请确保为您的模型生成它们并导出它们。您需要正常的数据才能使照明工作。

glEnable(GL_AUTO_NORMAL);的调用没有按照您的想法执行。它只会

  当使用GL_MAP2_VERTEX_3GL_MAP2_VERTEX_4生成顶点时,

生成法线向量。

因此,您自己导出普通数据并使用它,或者可能从您可用的网格数据中计算法线。

答案 1 :(得分:4)

您的代码缺少加载/设置正常数据。没有法线,照明不起作用。