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

时间:2012-06-20 11:04:47

标签: c++ opengl textures texture-mapping

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

我在过去的某个地方看到过一个方法,它有一个 colormap sush,如下所示: enter image description here enter image description here

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

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

在旁注上我的 skybox 不是你的平均形状,而是更多的天空直角,如下所示 enter image description here

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

,它都是alpha

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

1 个答案:

答案 0 :(得分: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;

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