Допустим, мы текстурируем квадрат (два треугольника). Я думаю, что этот вопрос похож на текстуру splatting, как в следующем примереGLSL текстура смешивания с текстурой деколя в нужном месте
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» (это плавающая?) переменная, а также текстура смешивания и текстура деколя с ней.
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);
}
Как достичь такой цели?
Или я могу просто создать текстуру splat на стороне opengl и передать ее в первый шейдер? Это даст мне до 4-х различных наклейках на квад, но будет медленным для частых обновлений (например, пулемёт хитов стены)
Твой тоже хорошо, только 30,8 тыс. Больше, чем 66, новичкам нужна помощь новичку. – Aristarhys