【问题标题】:GLSL code to 2D terrain with height map rendering带有高度图渲染的 2D 地形的 GLSL 代码
【发布时间】:2011-09-28 20:06:30
【问题描述】:

我有一个基于 2d 瓦片的地图和高度图图像,我想用它来使地图看起来不那么平坦。但我是 SFML 中使用的 GLSL 的新手。我正在寻找一些 GLSL 着色器,我可以将平铺纹理和高度图的一部分传递给相同的坐标或其他东西来创建高度错觉。但是我自己做所有事情,我没有时间为我想使用的这个着色器学习 GLSL,所以感谢您的任何回复(最好是如果有人可以发布一些着色器代码并为傻瓜解释它是怎么回事在.cpp文件中使用)

【问题讨论】:

  • “我没有时间为此学习 GLSL”不太可能让你走得更远,因为不太可能有人会为你编写所有代码,包括着色器绑定,基于一个相当模糊的描述。然而,给你一些想法:给高地打火机的阴影会给出一个廉价的 AO 近似值,这种近似值会给人一种深度印象。使用 dFdx/dFdy 您可以估计地形法线指向的位置。确定太阳的光矢量,并取点积。这使得面向“太阳”的山坡更亮,也给人一种深度的错觉。

标签: c++ opengl sfml


【解决方案1】:

您可能对"Parallax Occlusion Mapping" 技术感兴趣。一个好的实现可以在here找到。

【讨论】:

  • 谢谢这是一个很好的例子。我阅读了一些 GLSL 教程,但我仍然不明白我应该将什么传递给该着色器。我需要初始化 GLSL 代码中定义的每个 glogal 变量吗?
  • 需要设置以下变量:uniform mat4 matView;统一的mat3 matViewProjection;统一浮动 fHeightScale;统一浮动 fPerspectiveBias;统一 vec4 vLightOffset;
  • 应该注意的是,在基于 2D 瓦片的渲染中,视差遮挡映射实际上并没有多大用处。基于 2D 瓦片意味着“自上而下”的视图,在这种情况下视差为零。尽管人们可能会使用经常与 POM 一起计算的自遮挡术语。这会给人一些深度的印象。
  • 除非你把它设置成一个指定的值,这样你总是从同一个“角度”看。
【解决方案2】:

这将在屏幕上踢 Z 以产生高度图的错觉。 它实际上并没有改变几何。 [编辑] 这对于自上而下的视图没有用。我尝试根据新的 Z 和光线方向添加某种阴影效果。

这一行:pos.z += color.x + color.y + color.z; 是推动 Z 的因素。您可以为 scale 指定正数或负数。

/* Vertex Program
 * Shifts Z by Textures color     
 */
uniform sampler2D color_texture;
uniform float scale;
varying vec4 p_color;
void main()
{
     vec2 texcoords = gl_MultiTexCoord0.st;
     p_color = texture2D(color_texture,texcoords);
     vec4 color = texture2D(color_texture,texcoords);
     vec4 pos = gl_Vertex;
     pos.z +=  color.x + color.y + color.z;
     pos.z*=scale;
   gl_Position = gl_ModelViewProjectionMatrix * pos;
}

这是一个非常简单的片段程序..

/* Fragment Program
   Copies incoming fragment color without change.
*/
varying vec4 p_color;
 void main()
{
    gl_FragColor = p_color;
}  

【讨论】:

    【解决方案3】:

    这会使具有气泡/圆顶形状基础的地形网格变形,只要灯光位于世界空间中。地形镶嵌得越多,结果就越好。

    Const Float PI = 3.1415928;
    vec3 vVertex = vec3( gl_Vertex);
    float d = distance(lightPos , gl_Vertex);
    float d2;
        if (d < 1500.0)
        {
        d2 = d/1500.0;
        d = cos(PI*2.0*d2);
        }
        else
        {
        d=0.0;
        d2=0.0;
        }
    vVertex.y += (d*75.0)*(1.0-d2)-50.;
    
    gl_Position = gl_ModelViewProjectionMatrix* vec4(vVertex,gl_Vertex.w);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      相关资源
      最近更新 更多