我有一张基于2d图块的地图和高度图的图像,我想用它来使地图看起来不那么平坦。但我不熟悉在SFML中使用的GLSL。我正在寻找一些GLSL着色器,我可以在相同的坐标或东西上传递平铺纹理和高度贴图的一部分来创建高度错觉。但我自己做的一切,我没有时间学习GLSL只是为了我想使用的这个着色器,所以感谢任何回复(最好是有人可以发布一些着色器代码并解释它为傻瓜它是怎么回事用于.cpp文件)
答案 0 :(得分:0)
您可能对"Parallax Occlusion Mapping"技术感兴趣。可以找到一个很好的实现here。
答案 1 :(得分:0)
这将在屏幕上踢Z以给出高度图的错觉。 它实际上并没有改变几何形状。 [edit]这对于自上而下的视图没有用。我尝试根据新的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;
}
答案 2 :(得分: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);