OpenGL ES шейдер мульти текстуры - PullRequest
0 голосов
/ 27 марта 2012

Я работаю над созданием 3D-ландшафта.Пока что у меня есть сетка с вершинами и гранями, и все это выглядит прилично.Я применил к нему одну текстуру, но хочу иметь несколько текстур, возможно, в зависимости от высоты.Я думаю, мне нужен шейдер, чтобы сделать это.

Я новичок в шейдерах, но до сих пор я следовал этому уроку и у меня есть две текстуры, смешанные вместе.Тем не менее, я хочу полностью скрыть одну текстуру на определенных высотах (или позиции) и показать другую полную.

Я действительно не уверен, как подойти к этому с помощью шейдера.Может кто-нибудь дать совет, как начать?

1 Ответ

4 голосов
/ 27 марта 2012

Ради аргумента, предположим, что исходная геометрия изменяется от 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 в ваш вершинный шейдер, илиможет быть, принять его как атрибут ввода.

...