OpenGL照明小物件?

时间:2011-04-26 23:32:57

标签: opengl graphics lighting particles

在处理非常小的粒子时,我遇到了照明问题。我正在进行基于粒子的流体模拟,现在正在将流体渲染成非常小的多边形球体(非常小,我说的是球体的半径为0.03单位)。我场景中的灯光并没有照亮我想要的东西,我无法让它看起来正确。我正在寻找类似于此图像中颗粒柔和光线的东西...... particles with correct lighting

然而,我的粒子看起来像这样......

What my particles look like

看看我的颗粒是如何具有明亮的白色部分,而绿色颗粒只是轻柔地点亮并且没有大的白色热点。我知道原因要么是光线的设置,要么是粒子太小以至于光线占据更大的空间(这可能吗?)。我的照明设置如下......

GLfloat mat_ambient[] = {0.5, 0.5, 0.5, 1.0};
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {10.0};
GLfloat light_position[] = {0.0, 0.1, p_z, 1.0};
GLfloat model_ambient[] = {0.5, 0.5, 0.5, 1.0};

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);

3 个答案:

答案 0 :(得分:2)

感谢大家提出的所有建议,但遗憾的是没有任何效果。我与我的图形教授坐下来,我们确定这个问题实际上与粒子的大小有关,以及OpenGL将定向光视为距离任何顶点无限远的事实。解决这个问题的正确方法就是修改光源的恒定衰减......

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 10.0);

现在我的粒子看起来像这样......

enter image description here 这正是我追求的灯光!

答案 1 :(得分:1)

看起来您需要调低材质的镜面反射分量,稍微调低环境,并添加一些漫反射阴影(GL_DIFFUSE)。还可以考虑将灯光定位在视口/摄像机后面。

答案 2 :(得分:1)

粒子的大小不是问题 - 你的颜色过度饱和。

对于每个RGB组件,您应该有ambient + diffuse + specular <= 1.0

对于这样的场景,我希望ambient不超过0.1左右,漫反射为0.6左右,镜面反射弥补其余部分。