的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
,或者把它作为一个输入属性可能。
这是否需要顶点着色器中的任何东西(对不起,我是着色器的新手,无法尝试它就无法辨别 - 直到回到家时我无法做到) – wonza 2012-03-27 16:39:03
是的,您需要指定值for'secondTextureAlpha'在顶点。我建议只加载你的源码。您链接到的教程适用于桌面OpenGL,因此其顶点着色器无法直接适应 - 因此,我认为您有不同的代码,并且没有尝试猜测它的外观。 – Tommy 2012-03-27 18:13:57
是的,我不得不去适应它的OpenGL ES,而且我用它加载的一些变量会自动为您的API(这就是为什么我没有张贴任何的源代码,这样就不会混淆事项) – wonza 2012-03-27 18:27:59