使用openGL

使用openGL,opengl,lighting,Opengl,Lighting,我尝试用openGL制作一个小的3d场景,包括一些照明,我对我的场景很满意(虽然它没有什么特别的),我尝试添加一些照明来给它一些效果。然而,我可以在我的讲台上添加材料(没有纹理),这给了我光线,任何有纹理的东西都不会对其应用任何材料,因此它违背了拥有灯光的意义。下面是一些代码 // Setup GL_LIGHT0 glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient); // Setup ambient light glLightfv(GL_LIGH

我尝试用openGL制作一个小的3d场景,包括一些照明,我对我的场景很满意(虽然它没有什么特别的),我尝试添加一些照明来给它一些效果。然而,我可以在我的讲台上添加材料(没有纹理),这给了我光线,任何有纹理的东西都不会对其应用任何材料,因此它违背了拥有灯光的意义。下面是一些代码

// Setup GL_LIGHT0
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);     // Setup ambient light
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);     // Setup diffuse light
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);   // Setup specular light

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qa);

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 0.0);

// Setup GL_LIGHT1
glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient);     // Setup ambient light
glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse);     // Setup diffuse light
glLightfv(GL_LIGHT1, GL_SPECULAR, lightSpecular);   // Setup specular light

glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, qa);

glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 0.0);
// Setup GL_LIGHT2
glLightfv(GL_LIGHT2, GL_AMBIENT, lightAmbient);     // Setup ambient light
glLightfv(GL_LIGHT2, GL_DIFFUSE, lightDiffuse);     // Setup diffuse light
glLightfv(GL_LIGHT2, GL_SPECULAR, lightSpecular);   // Setup specular light

glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, qa);

glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 0.0);
// Setup GL_LIGHT3
glLightfv(GL_LIGHT3, GL_AMBIENT, lightAmbient);     // Setup ambient light
glLightfv(GL_LIGHT3, GL_DIFFUSE, lightDiffuse);     // Setup diffuse light
glLightfv(GL_LIGHT3, GL_SPECULAR, lightSpecular);   // Setup specular light

glLightf(GL_LIGHT3, GL_CONSTANT_ATTENUATION, ca);
glLightf(GL_LIGHT3, GL_LINEAR_ATTENUATION, la);
glLightf(GL_LIGHT3, GL_QUADRATIC_ATTENUATION, qa);

glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 180.0f);
glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 0.0);

// OpenGL provides a global ambient light component - we don't want this so set to zero
GLfloat global_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
并渲染我的房间+3d对象

glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
    glEnable(GL_LIGHT2);
    glEnable(GL_LIGHT3);

    // Define position and direction
    // NOTE: Placing these commands AFTER the above viewing (camera) transformations means the light position and direction appear to have a set point / direction in the 3D environment.  If these commands are placed BEFORE the above viewing transformations, then the light appears to move with the camera (as if it is attached to the camera!)
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

    glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, lightDirection1);
    glLightfv(GL_LIGHT1, GL_POSITION, lightPosition1);

    glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, lightDirection2);
    glLightfv(GL_LIGHT2, GL_POSITION, lightPosition2);

    glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, lightDirection3);
    glLightfv(GL_LIGHT3, GL_POSITION, lightPosition3);


    // setup materials for objects to draw
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMaterial);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial);
    glMaterialfv(GL_FRONT, GL_SPECULAR, specularMaterial);


    // 2. Draw scene
    glPushMatrix();
        drawRoom();
        glTranslatef(0.0,-0.75,0.0);
        glRotatef(90.0, 1.0,0.0, 0.0);
        glRotatef(-spin, 0.0,0.0, 1.0);
        glColor3f(1.0, 1.0, 1.0);
        drawPodium();
    glPopMatrix();

    // Save transformations prior to rendering scene
    glPushMatrix();

        glColor3f(0.0, 0.0, 1.0);   

        // Setup texture state
        glEnable(GL_TEXTURE_2D);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

        glRotatef(spin, 0.0,1.0, 0.0);
        // Render model

        glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial2);

        glTranslatef(0.0,0.8,0.0);
        glRotatef(1.0,1.0,0.0,0.0);
        myModel->renderTexturedModel();

        // Reset texture state
        glDisable(GL_TEXTURE_2D);

    // restore transformations after rendering scene
    glPopMatrix();
我的4盏灯在直升机上方呈方形,向下看向0.0,目前的结果是:


如果你能辨认出白色虚线,它们就是灯光的方向。平台的表面被照亮,平台旋转时,平台的侧面也被照亮。然而,房间和直升机的其余部分对光线没有反应,甚至像照明一样,甚至没有启用。因此,我认为这是因为除了讲台以外的所有东西都有纹理。

您需要设置glTexEnv,以指定纹理对象的照明方式

见:

21.030为什么打开纹理贴图时照明不工作?

或者为了更直接地解决您的问题

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

是什么导致了这种行为。如常见问题解答所述,指定“GL_替换”时,将使用纹理颜色替换基本照明颜色,这将覆盖所有照明计算。您可以完全删除这一行,因为GL_MODULATE是默认行为。

我不知道上述方法是否适用于您。我也有同样的问题。我的问题是我没有指定对象的法线

//指定法线 glNormal3f()


希望这能解决任何人的问题(我在互联网上尝试了所有其他方法,但没有任何效果;只有这种方法有效)。

谢谢你的帮助,我明白你的意思,尽管去掉了这句话,但仍然是一样的:(myModel->renderTexturedModel()中发生了什么)?这是带有注释的函数。我实际上看不到硬代码。//如果附加了纹理,则渲染纹理模型。这假设已设置纹理状态//这包括glEnable(GL_texture_2D)和glTexEnvf(GL_texture_ENV,GL_texture_ENV_MODE,);void renderTexturedModel()const;它基本上处理的是.3ds模型,我使用了一个附加纹理函数,以便它知道纹理文件的位置,然后该函数将进行渲染,从注释来看,该函数中不应该有任何“glTexEnv”偏差。不过,我注意到,不知怎的,直升机顶部的旋翼叶片似乎是黑色的(好像它现在接受光)然而房间的墙壁和地板以及直升机的主体仍然没有:/Hmm你看不到的代码并不总是那么有用。你是否尝试过实际使用GL_调制?可能只是你的灯光设置没有达到你认为应该达到的效果,但它确实起作用。照明依赖于为其中一个指定的法线。尝试一个非常基本的方法照明设置,看看是否可以先让它工作。