-3

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

4

3 回答 3

0

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

于 2011-07-05T14:08:52.490 回答
0

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

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

/* 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;
}  
于 2011-07-05T18:48:52.900 回答
0

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

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);
于 2016-02-06T17:18:18.530 回答