在海上实现真实的太阳reflection

我正在绘制一个三维渲染的岛屿,这个岛屿有一个白天/夜晚的周期和一个升起的水面上的太阳。

用这个Blinn-Phong教程衍生的片段着色器渲染大海。

http://www.lighthouse3d.com/tutorials/glsl-tutorial/directional-lights-ii/

太阳的位置是由一个点在其中心,随着时间的推移模拟一个昼夜周期。 当点在地平线上时,海面着色器使用Blinn-phong和法线贴图来产生reflection。

我不喜欢现在由于几个原因而呈现的方式。 最严重的问题是光线reflection是从太阳光盘中心的一个点计算出来的,这样当太阳的中心穿过地平线时,光线会以完全突然的方式闪烁。 看到我的意思是图片。

第二个问题在图片中也很明显的是光线是太阳中心的针刺,而海面上的reflection太过集中。 它应该从整个光盘传播,而不仅仅是在中心的一个点。 太阳的光盘btw只是一个广告牌。

中心在地平线上升之前

中心在地平线上升后

我想要发生的是随着太阳升起,光照水平逐渐增加,相应地随着光照的降低而减less。 我也希望海洋上的光线从整个光盘传播,而不是中间的一个针点。 这不可能是一个计算密集型的变化,因为代码注定要在android上的移动GPU上运行,但它应该仍然是令人愉快的。

我可以将光点移动到太阳的顶端,使光线看起来更早,然后设置。 然而,这可能会以不利的方式干扰光线计算(现在光线的中心是太阳的顶端)。 也许我可以从顶部的光点开始,随着太阳的升起,慢慢地将它移动到中心(并且在太阳落山的时候又回到原点)来抵消这个问题。 我也可以根据太阳的多less来计算太阳在低空时的强度,逐渐增加强度使光线更强。

我可能会有一组光源覆盖中心,顶部,左侧,底部和右侧,但这会增加复杂性,并且仍然看起来很奇怪。

有没有人对这些想法的可行性有意见,或者有其他方法可以实现这一点?

在太阳落下的时候,照亮光线的强度和位置,使其大致集中在地平线上太阳的一部分,并具有与地平线上太阳的面积成比例的强度,听起来像是一个值得尝试的想法。

我建议尝试的另一件事是基于距离使水面的镜面reflection功率降低。 与您的图像有关的问题是镜面高光形成了一条细线,指向太阳的中心,它应该与太阳本身一样宽。 在更远的地方降低规格能力应该有所帮助。 你将不得不尝试确切的方程。

你也可以把太阳的光照倒退。 太阳运动

为我可怕的绘画道歉