GLSL темные швы между масками

Текстурирование следует:

gl_FragColor=texture2D(my_main_texture, vUv);

gl_FragColor= mix(gl_FragColor,texture2D(texture[1], 32.0*vUv),texture2D(mask[0], vUv).r);
gl_FragColor= mix(gl_FragColor,texture2D(texture[2], 32.0*vUv),texture2D(mask[0], vUv).b);

Например, используя маску:

http://i.imgur.com/Y0p9ilH.png

Но по какой-то причине на границе между красной и синей масками не выдают значения текстуры, хотя количество каналов для каждого пикселя между синей и красной маской составляет 255

Например, следующий код, имеющий:

gl_FragColor=vec4(0.0);

gl_FragColor= mix(gl_FragColor,vec4(1.0),texture2D(mask[0], vUv).r);
gl_FragColor= mix(gl_FragColor,vec4(1.0),texture2D(mask[0], vUv).b);

Я получил:

http://i.imgur.com/hCMqbAm.png

Затененный круг - это граница между красной и синей маской, ее не должно быть

Как от этого избавиться? Возможно, причина использовать mix (), и есть другие способы достижения желаемого результата?

1 ответ

Решение

Это из-за линейной интерполяции текселей. Вы получаете "между значениями", которые наполовину синие и наполовину красные. Таким образом, в результате серый. Вы можете отключить интерполяцию текстур. Или попробуйте:

vec4 m0=texture2D(mask[0], vUv);
gl_FragColor= gl_FragColor*(1.0-m0.r-m0.b)+texture2D(texture[1], 32.0*vUv)*m0.r+texture2D(texture[3], 32.0*vUv)*m0.b;
Другие вопросы по тегам