一些想法:
烤小纹理为texture atlas让你有一个UV集(如果不止一个地图集需要,你可以在一个WebGL的程序使用多个纹理采样)在单一的平面瓷砖。
计算飞机的UV对应于与这些UV形状顶点和样本纹理地图的世界POS。为此,您可能需要传递以塑造材质平面的模型矩阵(如果知道其方向,则只是缩放/偏移量,或者如果平面固定,则为空)。
请记住,你不需要对小青瓦高分辨率纹理。还图谱可以通过使瓷砖纹理(从与正投影顶部) 或通过使纹理的单独采样代替。关于最后一种情况:要确定要传递哪些纹理,可以测试形状与地图切片的边界框。
渲染用简单的材料,你的形状到纹理和您画的飞机使用质地面膜在主要关口。
详细上:
广场的形状要在单独的容器和render it to a fixed size texture掩盖用非常简单的材料(写白字到处)与普通相机。在渲染过程之后,您应该在屏幕上看到黑色和白色形状的纹理(但会缩放为方形纹理)。
之后渲染场景的其余部分传递给瓷砖材质遮罩纹理。在fragmentPos作为uv的片段着色器样本遮罩纹理中,只有在得到白色时才绘制片段(否则放弃)。可能不是最好的主意(丢弃是昂贵的)。
更好的版本深度掩模方法的:在屏蔽通过禁用颜色写作(renderer.context.colorMask(false, false, false, false);
)。之后,你应该有你的形状在深度缓冲。然后将颜色掩码重置为全部true
,集合renderer.autoClearDepth = false
,集合tileMaterial.depthFunc = THREE.GreaterDepth
(more about depthFunc)。然后渲染你的瓷砖。这应该完成这项工作。
它也可以通过将掩码深度写入depthTexture并仅将其用作主通道中的纹理来完成。掩蔽
使用模板缓存:我没有尝试过,但它应该是适合你的情况。例如:1,2。想法与上面描述的掩蔽类似。
只是一个想法,最可能不是很有效。难道你不能按照需要的顺序在2D画布上绘制所有纹理,然后简单地在多边形上映射一个纹理? – uhura
是个好主意。我想我会尝试渲染纹理。它对我的基本用例应该足够高效。尽管如此,它似乎仍然过于复杂 – rawbeans