在OpenGL中实现天空盒的程序化/动态着色

5
我一直在开发一个应用程序,需要呈现一个过程化的天空,我的意思是这个“天空”有一个日夜循环,取决于模拟中的时间。
我曾经在某个地方看到过一种方法,他们有一个像这样的“色彩地图”: enter image description hereenter image description here 现在根据某些变量,比如时间,代码会扫描图片并使用一系列颜色来渲染天空纹理。在日出/日落时,代码将扫描到右边的黄色、橙色、红色颜色。
我不确定这叫什么,但我认为这就是我想要的。如果有人能向我展示或指向一个使用OpenGL和C++实现这种技术的例子,我会非常感激。
顺便说一句,我的“天空盒”不是你平常见到的形状,它更像是一个“天空直角”,如下图所示: enter image description here 正如你所看到的,“天空直角”没有“顶部”,只有你看到的两个蓝色面板上会呈现天空(黑色是背景)。我想知道有没有办法在这两个平面上呈现一个过程化/动态的日夜天空(而且无论是“晚上”还是“白天”,顶部都会淡出到alpha)。此外,任何关于如何“扫描色彩地图并将其设置为OpenGL/C++纹理”的解释/示例都将不胜感激。

2
给那位投票关闭的人:这实际上是一个有趣的问题,既不是离题也不是不清楚。只是一个比较困难的话题。不幸的是,我现在必须准备演讲,否则我会详细解释多层天空渐变组合(这就是这个纹理要用于的内容)。 - datenwolf
1
@datenwolf,也许您可以在几天后再次查看这个话题。我相信还有其他像我一样希望得到一个受过良好教育的答案的人。 - s3rius
1个回答

1

在此网址http://golabistudio.com/siamak/portfolio.html中下载最新的项目(特效
C++源代码不可用,但着色器源代码可用。
您需要做的是将2个纹理传递到您的着色器(在渲染平面时)。第一个纹理是标准的天空盒纹理。第二个纹理是您的昼夜循环纹理。最简单的情况下,它可以是高度为1的宽梯度纹理,从蓝色到黑色。通过将第二个纹理传递到您的着色器中,您可以在x = time的位置上拾取一个像素,并将颜色添加到您的漫反射纹理(第一个纹理)中。

下一步是日出。同样,在最简单的情况下,要实现这一点,您必须创建一个宽度为2的纹理,其中一侧是日出像素,水平排列,另一侧是夜晚梯度:(宽度扩大) http://i.imgur.com/Rl8XJ.png

现在,对于您的漫反射纹理(第一个天空盒纹理)的传入UV坐标,您需要执行以下操作:

  float2 uvpos;
  uvpos.y = IN.uv.y;//the position same as skybox texture
  uvpos.x = 0;//a sample from first horizontal pixel
  float4 colour1 = tex2D( gradientTexture, uvpos);
  uvpos.x = 0.5;//a sample from second horizontal pixel
  float4 colour2 = tex2D( gradientTexture, uvpos);

  float4 skycolor = lerp(colour1 , colour2, (your day time));
  skycolor.xyz += tex2D(skyTexture, IN.uv).xyz;

这是非常简单的实现,但我认为应该能让你开始工作。


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