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

Posted

技术标签:

【中文标题】OpenGL中天空盒的程序/动态着色【英文标题】:Procedural / Dynamic colouring of a skybox in OpenGL 【发布时间】:2012-06-20 11:04:46 【问题描述】:

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

我在过去的某个地方看到过一种方法,他们有一个 colormap sush,如下所示:

现在,根据某些变量(例如时间),代码会以某种方式扫描图像并使用一系列颜色作为天空的纹理。同样在日出/日落期间,代码将扫描为右侧的黄色、橙色、红色。

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

顺便说一句,我的 skybox 不是你的平均形状,它更像是一个 sky-right-angle,如下所示

正如你所看到的,天空直角没有顶部,只有你看到的两个蓝色边会渲染天空(黑色是背景)。我想知道是否有任何方法可以在这两个平原上渲染程序/动态夜空(它们之间的接缝也不明显)并且作为一个附带问题也有它,所以平原的顶部会淡出无论是晚上还是白天

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

【问题讨论】:

致投票赞成关闭的人:这实际上是一个有趣的问题,既不离题也不不清楚。这只是一个困难的话题。不幸的是,我现在必须准备一个演讲,否则我会花很多时间解释多层天空渐变组合(这就是这个纹理的用途)。 @datenwolf 也许你过几天再来看这个话题。我相信还有像我这样的人会欣赏一个受过良好教育的答案。 【参考方案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;

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

【讨论】:

以上是关于OpenGL中天空盒的程序/动态着色的主要内容,如果未能解决你的问题,请参考以下文章

关于Unity中如何代码动态修改天空盒

unity3d怎么在脚本里面更改天空盒

unity 中怎样设置动态天空盒,让天空盒上的云动起来

✠OpenGL-9-天空和背景

GLSL 纹理函数只为天空盒返回黑色

透明天空盒+透明高度图的OpenGL混合问题