OpenGL中天空盒的程序/动态着色

xyz*_*xyz 5 c++ opengl textures texture-mapping

我一直在开发一个需要渲染程序天空的应用程序,我的意思是天空有一个夜晚周期,根据模拟中的时间而变化.

我已经看到在过去,他们有一个地方的方法颜色表 sush为这样的: 在此输入图像描述在此输入图像描述

现在取决于某些变量,例如时间,代码扫描图像并使用一系列颜色作为天空纹理.此外,在日出/日落期间,代码将扫描为右侧的黄色,橙色,红色.

我不确定这是什么,但我认为这就是我所追求的.我很乐意,如果有人会告诉我或指出我使用opengl和C++这种技术的例子.

在侧面说明我的天空盒不是你的平均形状,它更像是天空直角,如下所示 在此输入图像描述

正如你所看到的那样,天空右上角没有顶部,只有你看到的两个蓝色边将呈现天空(黑色是BG).我想知道是否有任何方法可以在这两个平原上渲染一个程序/动态的夜空(没有它们之间的缝隙也很明显)并且作为一个侧面问题也有它所以平原的顶部淡出与α-无论其夜间白天

关于如何扫描色彩图然后在OpenGL/C++中将其设置为纹理的任何解释/示例都非常感谢.

Sia*_*aie 1

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

下一步就是看日出。同样,最简单的做法是,您必须创建宽度为 2 的纹理,一侧是水平的日出像素,另一侧是夜间渐变:(宽度放大) https://i.stack.imgur.com/y8LNI。 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;
Run Code Online (Sandbox Code Playgroud)

这是非常简单的实现,但我认为应该能让你继续下去。