OpenGL Lighting挣扎

时间:2010-10-26 06:37:10

标签: c opengl

我正处于一个教授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 个答案:

答案 0 :(得分:2)

消除急剧下降,增大环境光。在OpenGL中没有全局照明模型,因此如果没有其他光线落在它上面,那么参数绝对没有效果。

由于你正在使用glVertex类型的调用,我会想到你正在使用固定功能管道吗?如果是,则在顶点处计算光照,然后在多边形表面上进行插值。这意味着镜面高光在'大'多边形上不能很好地工作 - 粗略地说,高光不能出现在多边形的中间。具有可编程管道的GPU(包括现在的移动电话中的那些)可以计算每个像素的光照而不是每个顶点,但OpenGL不会为您执行此操作,因此您需要自己深入研究着色器编程。或者只是确保您的模型由足够小的多边形组成。

你的光泽指数也很高 - 你试过把它拨到几个档位吗?

答案 1 :(得分:1)

当看到背景时,它看起来像右边的聚光灯,只是将场景变成温暖的光线,左边的Flakscheinwerfer在极端闪电中晒太阳,消除每一个阴影