GLSL代码到2D地形与高度地图渲染

GLSL code to 2D terrain with height map rendering

本文关键字:高度 地图 代码 2D GLSL      更新时间:2023-10-16

我有一个2d贴图和图像的高度地图,我想用它来使地图看起来不那么平坦。但是我对SFML中使用的GLSL很陌生。我正在寻找一些GLSL着色器,我可以在相同的坐标上传递贴图纹理和高度地图的一部分,或者创建高度错觉。但是我自己做的一切,我没有时间学习GLSL只是为了这一个着色器,我想使用,所以感谢任何回复(最好是如果有人可以发布一些着色器代码,并解释它是如何在。cpp文件中使用的)

您可能对"视差遮挡映射"技术感兴趣。可以在这里找到一个很好的实现

这将踢屏幕上的Z给人一种高度地图的错觉。它实际上不会改变几何形状。这对于自顶向下的视图是没有用的。我会尝试添加一些基于新Z和光方向的阴影效果。

这一行:pos。Z += color。X +颜色。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程序…

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

这将使地形网格变形为气泡/圆顶形状的基础,无论光线在世界空间中的位置。地形镶嵌得越多,效果越好。

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);