我试图将纹理仅放在球体的一部分中。 我有一个代表地球的球体,其地形和地形纹理适用于地球的一部分,比如意大利的卫星地图。 我想在意大利所在的球体部分显示这个地形。
我正在创建我的球体绘制一组三角形条带。 据我所知,如果我想使用纹理,我需要为每个顶点指定纹理坐标(glTexCoord2 *)。但我没有一个有效的纹理。 那么如何告诉OpenGL跳过这些顶点的纹理?
答案 0 :(得分:2)
我假设你有两个纹理或一个颜色属性用于球体的其余部分(“不是意大利”)。
最简单的方法是创建一个覆盖整个球体的纹理,但使用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
,这是向量的组件。因此,您可以看到alpha=1
(“不是意大利”),color1
将被选中,反之亦然alpha=0
。
您可以使用纹理数组或类似的方法将其扩展到多个图层,但我会保持简单的2层开始。