2012-03-27 170 views
0

我正在創建一個三維景觀。到目前爲止,我已經創建了一個用頂點和麪創建的網格,並且它看起來都不錯。我已經對它應用了單個紋理,但想要擁有可能基於高度的多個紋理。我在想我需要着色器來做到這一點。的OpenGL ES着色器多紋理

我是新來着色,但到目前爲止,我已經按照這個tutorial,有兩個紋理混合在一起。但是,我想在某些高度(或位置)上完全淡出一個紋理,並顯示其他完整性。

我真的不知道如何使用着色器來處理這個。有人可以就如何開始提供一些建議嗎?

回答

4

爲了便於討論,假設你的源幾何體從Y = 0延伸到y = 1,您想將第二個紋理是在y = 0完全透明,在y = 1完全不透明。然後你可以添加一個不同的名字,命名爲secondTextureAlpha或類似的東西。在着色器的預轉型y值加載它,然後從源紋理或者因此受到secondTextureAlpha,結合傳入值,第二是乘法,如果你想堅持用添加劑調合而成,或通過mix功能倍增。

所以例如在fragement着色器可能最終看起來像:

varying vec3 lightDir,normal; 
varying lowp float secondTextureAlpha; 
uniform sampler2D tex,l3d; 

void main() 
{ 
    vec3 ct,cf; 
    vec4 texel; 
    float intensity,at,af; 
    intensity = max(dot(lightDir,normalize(normal)),0.0); 

    cf = intensity * (gl_FrontMaterial.diffuse).rgb + 
         gl_FrontMaterial.ambient.rgb; 
    af = gl_FrontMaterial.diffuse.a; 
    texel = mix(texture2D(tex,gl_TexCoord[0].st), 

      texture2D(l3d,gl_TexCoord[0].st), secondTextureAlpha); 
    ct = texel.rgb; 
    at = texel.a; 
    gl_FragColor = vec4(ct * cf, at * af); 

} 

,實現更復雜的映射,只需調整您如何在頂點着色器加載secondTextureAlpha,或者把它作爲一個輸入屬性可能。

+0

這是否需要頂點着色器中的任何東西(對不起,我是着色器的新手,無法嘗試它就無法辨別 - 直到回到家時我無法做到) – wonza 2012-03-27 16:39:03

+0

是的,您需要指定值for'secondTextureAlpha'在頂點。我建議只加載你的源碼。您鏈接到的教程適用於桌面OpenGL,因此其頂點着色器無法直接適應 - 因此,我認爲您有不同的代碼,並且沒有嘗試猜測它的外觀。 – Tommy 2012-03-27 18:13:57

+0

是的,我不得不去適應它的OpenGL ES,而且我用它加載的一些變量會自動爲您的API(這就是爲什麼我沒有張貼任何的源代碼,這樣就不會混淆事項) – wonza 2012-03-27 18:27:59