试图了解Opengl上的光线,如何模拟逼真的阳光?


13

我不知道我做错了什么还是错过了什么,但我想模拟阳光,例如在晴天。

当物体面对定向光时,它的光线很好,那里没有问题。如果我绕过该物体并回头看,那是黑暗的。并不是因为我正在使用GL_AMBIENT而太暗,但对于晴天来说仍然太暗了。如果增加该值,它将永远看起来不会更好,因为物体面向光的一侧会太亮。

而且,环境光还有一个烦人的问题,当看着物体的背面时,我看不到任何形状,只有纯色。很难解释,下面是一些图片:

对象前:http
: //i.stack.imgur.com/YW53X.png对象前:http : //i.stack.imgur.com/Qufha.png

如您所见,正面看起来很漂亮,可以看到红色的形状。在背面,很简单,看不到相同的形状。

现在,我知道我正在看物体的背面,并且我朝光的方向看,它应该比正面暗。但是它不应该看起来像这样简单。这不是我们在阳光下看着某个物体时看到的,我们看到这些物体形成了某种形状。

如何在OpenGL上具有相同(或相似)的效果?

我的灯光当前定义如下:

float posLight0[4] = {-1.0f, 1.0f, 1.0f, 0.0f};
float ambLight0[4] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambLight0);

我建议您考虑使用着色器(如果可能)。OpenGL固定功能管道使用相当简单的光照模型,而着色器使您可以完全控制数学。
令人难以置信的和尚

Answers:


11

使用环境光时,由于漫反射光被添加到环境光中,并且漫反射光默认为1.0,因此您的对象显得太亮。这总计为1.5,高于1.0的所有内容都会被钳位。将漫射光设置为0.5:

float difLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difLight0);

第二个问题很难解决。您可以尝试向表面添加一些细节,例如纹理或凹凸贴图。在OpenGL中,环境光是恒定的,但在现实世界中,情况并非如此。为了模拟现实世界,需要某种形式的全局照明解决方案。环境光遮挡在这里有很大帮助,但比仅设置OpenGL状态更难实现。您可以在3D建模软件中将环境遮挡烘焙到模型的顶点,也可以使用SSAO,但是我不再赘述。

您可以轻松地从其他方向(例如相反方向)添加另一个调光器光源。这将是不现实的,但至少会为对象的背面提供某种形状。

还可以考虑在应用程序中添加镜面高光。它将使物体发光。

float specLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specLight0);
glMaterialfv(GL_FRONT, GL_SHININESS, 10.0f); // Shininess between 0 and 128

您还可以分别指定灯光和材料颜色,尤其是如果默认设置不适合您时。


因此,在OpengGL中没有简单直接的方法可以完成我想要的工作……太糟糕了。也许我会尝试添加另一个光源,但是如何精确指定光强度?
rfgamaral 2011年

GL_SPECULARGL_SHININESS似乎并不虽然...我的确发生了变化产生任何影响glMaterialfvglMateriali,因为它不是编译。并且还尝试了更大的值,例如128。在我看来,这是相同的...也许问题出在我加载的模型(obj / mtl)上,所以必须看看。
rfgamaral 2011年

1
@Nazgulled刚刚检查了light0的高光默认值为1.0,但是材质的高光默认值为0.0。因此更改glLightfv(GL_LIGHT0,GL_SPECULAR,specLight0); 到glMaterialfv(GL_FRONT,GL_SPECULAR,specLight0); 设置glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,​​GL_TRUE)也很好。否则当相机旋转时镜面反射可能计算不正确。
msell,2011年

1
@Nazgulled对于辅助光源,将环境和镜面反射设置为零,并将漫反射设置为0.2之类的小值。您还可以将所有光源的环境设置为零,并使用GL_LIGHT_MODEL_AMBIENT来使用全局环境。
msell 2011年

2

OpenGL的环境光是单色的,但现实世界中的环境光通常从上方变亮,从下方变暗。您可以在OpenGL中对此进行近似,方法是将环境光设置为非常深的蓝色,并添加指向下方的深蓝色定向光。这样,再加上来自太阳的任何地方的明亮的白色定向光,都可以很好地近似室外光。

您真正应该做的是编写一个着色器,该着色器计算每个像素的光,但是从您要到达的位置将花费一些时间。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.