我试图将纹理仅放在球体的一部分中。我有一个代表地球的球体,它的地形和地球一部分的地形纹理,比如意大利的卫星地图。我想展示意大利所在球体部分的地形。
我正在创建我的球体,绘制一组三角形条带。据我了解,如果我想使用纹理,我需要为每个顶点指定纹理坐标(glTexCoord2*)。但我没有对所有这些都有效的纹理。那么我如何告诉 OpenGL 跳过这些顶点的纹理呢?
我试图将纹理仅放在球体的一部分中。我有一个代表地球的球体,它的地形和地球一部分的地形纹理,比如意大利的卫星地图。我想展示意大利所在球体部分的地形。
我正在创建我的球体,绘制一组三角形条带。据我了解,如果我想使用纹理,我需要为每个顶点指定纹理坐标(glTexCoord2*)。但我没有对所有这些都有效的纹理。那么我如何告诉 OpenGL 跳过这些顶点的纹理呢?
我假设您有两个纹理或球体其余部分的颜色属性(“不是意大利”)。
最简单的方法是创建一个覆盖整个球体的纹理,但使用 Alpha 通道。例如,alpha=1
用于“not italy”和alpha=0
“italy”。然后你可以在你的片段着色器中做这样的事情(伪代码,我没有测试任何东西):
...
uniform sampler2D extra_texture;
in vec2 texture_coords;
out vec3 final_color;
...
void main() {
...
// Assume color1 to be the base color for the sphere, no matter how you get it (attribute/texture), it has at least 3 components.
vec4 color2 = texture(extra_texture, texture_coords);
final_color = mix(vec3(color2), vec3(color1), color2.a);
}
混合中的颜色组合如下,mix(x,y,a) = x*(1-a)+y*a
对于向量,这是按组件方式完成的。所以你可以看到 if alpha=1
("not Italy"),color1
将被选中,反之亦然alpha=0
。
您可以使用纹理数组或类似的东西将其扩展到多个层,但我会保持简单的 2 层开始。