代码之家  ›  专栏  ›  技术社区  ›  Trasvi

OpenGL灯光斗争

  •  4
  • Trasvi  · 技术社区  · 15 年前

    我正在进行一个教授OpenGL基础知识的项目。我对相机的旋转、平移等大部分要求都很好,但我对灯光的要求很高。

    current program compared to sample solution

    万一你看不出来,我在卡车上看到的是单色的。阴影是非常尖锐和黑暗,高点是单一的颜色,而不是镜面反射。 这个项目需要使用纹理;我在这里展示的是一个普通灰色像素的基本纹理,但我可以使用任何纹理(包括沙滩沙一个用于地面)。 我正在从网格中绘制对象:

    GLfloat ambient[] = {0.1, 0.1, 0.1, 1};
    GLfloat diffuse[] = {0.1, 0.1, 0.1, 1};
    GLfloat specular[] = {1.0, 1.0, 1.0, 1.0};
    GLfloat shine = 100.0;
    
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
    glMaterialf(GL_FRONT, GL_SHININESS, shine);
    
    glEable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textureNumber);
    glBegin(GL_TRIANGLES);
    
    for (int i = 0; i < meshes[n]->nTriangles; i++) {
        for (int j = 0; j < 3; j++) {
            glNormal3fv(mesh -> normals[mesh->triangles[i][j]]);
            glTexCoord2fv(mesh->texCoords[mesh->triangles[i][j]]);
            glVertex3fv(mesh -> vertices[mesh->triangles[i][j]]);
        }
    }
    glEnd();
    

    场景中有一盏灯:

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST)
    
    
    GLfloat diffuse0[]={1.0, 1.0, 1.0, 1.0};
    GLfloat ambient0[]={1.0, 1.0, 1.0, 1.0};
    GLfloat specular0[]={1.0, 1.0, 1.0, 1.0};
    GLfloat light0_pos[]={1.0, 1.0, 1,0, 1.0};
    
    glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specular0);
    
    glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);
    glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 2.0);
    

    glEnable 我错过的电话? 任何对其他地方的帮助、建议或建议都非常感谢。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Tommy    15 年前

    为了消除急剧下降,放大环境光。OpenGL中没有全局光照模型,因此参数除了在没有其他光线照射的情况下作为人脸的颜色之外,绝对没有影响。

    既然您使用的是glVertex类型调用,那么我就假设您使用的是固定功能管道?如果是,则在顶点处计算照明,然后在多边形曲面上进行插值。这意味着镜面反射高光在“大”多边形上效果不太好粗略地说,高光不能出现在多边形的中间。带有可编程管道(包括现在移动电话中的管道)的GPU可以计算每个像素的光照,而不是每个顶点的光照,但OpenGL并不能为您做到这一点,所以您需要自己深入研究着色器编程。或者确保模型由足够小的多边形组成。

        2
  •  1
  •   Peter Miehle    15 年前

    当看背景的时候,它看起来像是右边的聚光灯,把场景沐浴在温暖的光线中,左边的火箭筒把所有的东西都晒在极光下,消除了所有的阴影