GLSL 着色器:在两个以上纹理之间进行插值

2024-01-07

我已经在 OpenGL 中实现了高度图。目前它只是一个正弦/余弦弯曲地形。 目前我正在白色的“冰”和较暗的“石头”纹理之间进行插值。 这是这样完成的:

color = mix(texture2D(ice_layer_tex, texcoord), texture2D(stone_layer_tex, texcoord), (vertex.y + amplitude) / (amplitude * 2))

结果:

它工作正常,但如果我想添加更多纹理,例如草纹理,以便插值顺序为“冰、石头、草”,我该怎么办?我认为,没有像这样的功能mix(sampler2D[], percentages[])?我如何按照这个逻辑编写 GLSL 方法?


mix()实际上只是一个方便的函数,您可以轻松地自己编写。定义是:

mix(v1, v2, a) = v1 * (1 - a) + v2 * a

或者换句话说,它计算的加权平均值v1 and v2,有两个权重w1 and w2满足约束条件的 0.0 到 1.0 之间的浮点值w1 + w2 = 1.0:

v1 * w1 + v2 * w2

您可以直接对此进行概括以计算 2 个以上输入的加权平均值。例如,对于 3 个输入v1, v2 and v3,您将使用 3 个权重w1, w2 and v3满足约束条件w1 + w2 + w3 = 1.0,并计算加权平均值:

v1 * w1 + v2 * w2 + v3 * w3

对于您的示例,确定要为 3 个纹理中的每一个使用的权重,然后使用如下内容:

weightIce = ...;
weightStone = ...;
weightGrass = 1.0 - weightIce - weightStone;
color = texture2D(ice_layer_tex, texcoord) * weightIce +
        texture2D(stone_layer_tex, texcoord) * weightStone +
        texture2D(grass_layer_tex, texcoord) * weightGrass;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLSL 着色器:在两个以上纹理之间进行插值 的相关文章

随机推荐