在处理非常小的粒子时,我遇到了照明问题。我正在进行基于粒子的流体模拟,现在正在将流体渲染成非常小的多边形球体(非常小,我说的是球体的半径为0.03单位)。我场景中的灯光并没有照亮我想要的东西,我无法让它看起来正确。我正在寻找类似于此图像中颗粒柔和光线的东西......
然而,我的粒子看起来像这样......
看看我的颗粒是如何具有明亮的白色部分,而绿色颗粒只是轻柔地点亮并且没有大的白色热点。我知道原因要么是光线的设置,要么是粒子太小以至于光线占据更大的空间(这可能吗?)。我的照明设置如下......
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);
答案 0 :(得分:2)
感谢大家提出的所有建议,但遗憾的是没有任何效果。我与我的图形教授坐下来,我们确定这个问题实际上与粒子的大小有关,以及OpenGL将定向光视为距离任何顶点无限远的事实。解决这个问题的正确方法就是修改光源的恒定衰减......
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 10.0);
现在我的粒子看起来像这样......
这正是我追求的灯光!
答案 1 :(得分:1)
看起来您需要调低材质的镜面反射分量,稍微调低环境,并添加一些漫反射阴影(GL_DIFFUSE)。还可以考虑将灯光定位在视口/摄像机后面。
答案 2 :(得分:1)
粒子的大小不是问题 - 你的颜色过度饱和。
对于每个RGB组件,您应该有ambient + diffuse + specular <= 1.0
对于这样的场景,我希望ambient
不超过0.1左右,漫反射为0.6左右,镜面反射弥补其余部分。