2010-10-26 132 views
4

我正在教一个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

为了消除锐减 - 关闭,放大环境光线。在OpenGL中没有全局照明模型,因此参数除了没有其他光线落在面上的颜色之外绝对没有效果。

由于您正在使用glVertex类型的调用,我会走出一条腿并猜测您正在使用固定功能管道?如果是这样,则在顶点计算光照,然后在多边形表面上进行插值。这意味着镜面高光在“大”多边形上不能很好地工作 - 粗略地说,高光不能出现在多边形的中间。带有可编程流水线(包括现今手机中的流水线)的GPU可以计算每个像素点的光照,而不是每个顶点的光照,但OpenGL不会为你做这件事,所以你需要自己研究着色器编程。或者确保您的模型由足够小的多边形组成。

你的闪亮指数也相当高 - 你有没有试过拨几下?

1

望着后台的时候,它看起来就像刚沐浴场景热烈光权的焦点,并在极端闪电左晒着一切Flakscheinwerfer,消除阴影笼罩

+0

...这是帮助如何? – DarkDust 2010-10-26 07:44:25

+1

也许他可以尝试漫反射(不太亮)1.0的环境和镜面值?他的光芒是一个巨大的白色星星,如果他把价值观调整到更黄的聚光灯下,他会得到更好的结果。 – 2010-10-26 08:31:25