的OpenGL ES着色器多纹理

问题描述:

我正在创建一个三维景观。到目前为止,我已经创建了一个用顶点和面创建的网格,并且它看起来都不错。我已经对它应用了单个纹理,但想要拥有可能基于高度的多个纹理。我在想我需要着色器来做到这一点。的OpenGL ES着色器多纹理

我是新来着色,但到目前为止,我已经按照这个tutorial,有两个纹理混合在一起。但是,我想在某些高度(或位置)上完全淡出一个纹理,并显示其他完整性。

我真的不知道如何使用着色器来处理这个。有人可以就如何开始提供一些建议吗?

为了便于讨论,假设你的源几何体从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