Допустим, мы текстурируем четырехугольник (два треугольника).Я думаю, что этот вопрос похож на разбрызгивание текстуры, как в следующем примере
precision lowp float;
uniform sampler2D Terrain;
uniform sampler2D Grass;
uniform sampler2D Stone;
uniform sampler2D Rock;
varying vec2 tex_coord;
void main(void)
{
vec4 terrain = texture2D(Terrain, tex_coord);
vec4 tex0 = texture2D(Grass, tex_coord * 4.0); // Tile
vec4 tex1 = texture2D(Rock, tex_coord * 4.0); // Tile
vec4 tex2 = texture2D(Stone, tex_coord * 4.0); // Tile
tex0 *= terrain.r; // Red channel - puts grass
tex1 = mix( tex0, tex1, terrain.g ); // Green channel - puts rock and mix with grass
vec4 outColor = mix( tex1, tex2, terrain.b ); // Blue channel - puts stone and mix with others
gl_FragColor = outColor; //final color
}
Но я хочу просто разместить 1 наклейку на базовой текстуре квадра в нужном месте.
Алгоритм такой же, ноя думаю, что нам не нужна дополнительная текстура с 1 заполненным слоем для хранения позиций (например, где красный слой! = 0) декаля, как мы должны сгенерировать нашу собственную переменную "terrain.r" (это float?) и смешать базуТекстура и текстура с ним.
precision lowp float;
uniform sampler2D base;
uniform sampler2D decal;
uniform vec2 decal_location; //where we want place decal (e.g. 0.5, 0.5 is center of quad)
varying vec2 base_tex_coord;
varying vec2 decal_tex_coord;
void main(void)
{
vec4 v_base = texture2D(base, base_tex_coord);
vec4 v_decal = texture2D(Grass, decal_tex_coord);
float decal_layer = /*somehow get our decal_layer based on decal_position*/
gl_FragColor = mix(v_base, v_decal, decal_layer);
}
Как этого добиться?
Или я могу просто сгенерировать текстуру сплата на стороне opengl и передать ее первому шейдеру?Это даст мне до 4 различных наклеек на квадроциклах, но будет частым обновлением (например, попадание пулемета в стену)