2011-07-05 32 views
-3

我有一个基于2D的地图和高度图的图像,我希望使用它来使地图看起来不那么平坦。但我是SFLS中使用的GLSL的新手。我正在寻找一些GLSL着色器,我可以将瓦片纹理和高度贴图的一部分传递到同一坐标上或创建高度错觉。但是我自己做了所有事情,而且我没有时间学习GLSL,只是希望使用这一个着色器,所以非常感谢任何回复(最好是有人可以发布一些着色器代码并将其解释为傻瓜)用于.cpp文件)GLSL代码到2D高程地图渲染地形

+5

“我没有时间去学习GLSL只是这种”不可能让你远,因为它不太可能有人会写所有的代码对你来说,包括着色器绑定,基于一个相当模糊的描述。然而,给你一些想法:遮光更高的地面打火机将给出一种便宜的AO近似,这种给人以深度印象。使用dFdx/dFdy,您可以估计地形法线所指向的位置。为阳光安定一个光照矢量,并采取点积。这使得面向“太阳”的山坡更加明亮,也给人一种深度的幻觉。 – Damon

+4

提供代码。 – pmr

回答

0

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

+0

谢谢,这是很好的例子。我阅读了一些GLSL教程,但我仍然不明白我应该传递给该着色器。我需要初始化GLSL代码中定义的每个glogal变量? – Reiv

+0

您需要设置以下变量:uniform mat4 matView; uniform mat3 matViewProjection; uniform float fHeightScale; uniform float fPerspectiveBias; uniform vec4 vLightOffset; – Constantinius

+0

应该注意的是,在基于二维贴片的渲染中,视差遮挡贴图并不十分有用。 2D瓦片意味着“自上而下”的观点,在这种情况下,视差为零。尽管可以使用通常与POM一起计算的自闭合项。这会给人一些深度的印象。 – Damon

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