OpenGL如何为小物体添加光照?

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

http://en.wikipedia.org/wiki/Ambient_occlusion - Ben Jackson
看起来是有用的信息,但我该如何将其应用到我的场景中呢?我没有使用着色器,也不确定这会如何改变我对光的设置。 - Nitrex88
应用它并不容易:这就是为什么我没有将其作为答案的原因。为了在一般情况下获得更柔和的阴影,你可以尝试添加多个光源(例如8个光源,每个光源强度为1/8),分布在靠近当前光源的一个小区域内,以软化边缘。 - Ben Jackson
那是个好主意,我会尝试添加更多的灯光。谢谢! - Nitrex88
3个回答

2

感谢大家提供的所有建议,但不幸的是没有什么有效的方法。我和我的图形学教授一起研究后发现,这个问题实际上与粒子的大小有关,而且OpenGL将方向光视为无限远离任何顶点。修复它的正确方法是修改光源的常数衰减,像这样...

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 10.0);

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

enter image description here 这正是我追求的照明效果!


1

看起来你需要降低材质的高光成分,稍微降低环境光,并添加一些漫反射阴影(GL_DIFFUSE)。同时考虑将光源放置在视口/相机后方。


1

粒子的大小不是问题——您过度饱和了颜色。

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

对于这样的场景,我期望ambient不超过0.1左右,漫反射约为0.6,而高光反射占据其余部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接