我一直在开发需要渲染程序天空的应用程序,这意味着天空的昼夜周期会根据模拟中的时间而变化。

我过去曾在某处看到过这样的方法,它们会像这样散布着一个颜色图:

现在,取决于时间等变量,代码会以某种方式在图像上进行扫描,并为天空的纹理使用一系列颜色。同样在日出/日落期间,代码将扫描为右侧的黄色,橙色,红色。

我不确定这叫什么,但我认为这就是我的追求。如果有人向我展示或向我指出将这种技术与opengl和C++一起使用的示例,我将非常乐意。

顺便说一句,我的天空盒不是您的平均形状,而是更多的天空直角,如下所示

如您所见,天空直角没有顶部,只有看到的两个蓝色侧面将渲染天空(黑色是BG)。我想知道是否有什么办法可以在这两个平原上绘制程序/动态的昼夜天空(在它们之间也没有明显的缝隙),并且作为附带的问题也有,所以平原的顶部逐渐消失了不管是白天还是黑夜

非常感谢任何有关如何扫描颜色图然后将其设置为OpenGL/C++纹理的解释/示例。

最佳答案

在此URL http://golabistudio.com/siamak/portfolio.html中下载最后一个项目(特殊效果)
c++源不可用,但存在着色器源。
您需要做的是将2个纹理传递到着色器(在渲染平面时)。第一个纹理是您的标准Skybox纹理。第二个纹理是您的昼/夜循环纹理。最简单的是,它可以是高度为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;

这是非常简单的实现,但我认为应该可以帮助您。

10-06 00:44