3

在处理非常小的粒子时,我遇到了照明问题。我正在做基于粒子的流体模拟,现在正在将流体渲染为非常小的多边形球体(我说的是球体的半径约为 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);
4

3 回答 3

2

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

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 10.0);

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

在此处输入图像描述 这正是我所追求的照明!

于 2011-04-27T18:38:43.203 回答
1

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

于 2011-04-27T00:31:09.437 回答
1

颗粒的大小不是问题——你的颜色过饱和了。

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

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

于 2011-04-27T11:00:36.487 回答