2011-07-05 33 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);