我正在绘制一个具有 100 到 2500 个三角形面的中型到大型对象,具体取决于用户之前选择的一些选项。物体本身是固定的——不会移动,不会发生任何变化,什么都没有。到目前为止,您可以将事情想象为“我的应用程序加载 OBJ 文件,然后用户查看它们”,您不会错太多。
棘手的一点是,在任何时候,对象上的一些面都会被“选中”,而另一些则不会。所选面必须以不同的纹理显示——相同的 UV 坐标,但像素颜色来自不同的位图。在任何给定时间将选择大约一半的面,哪些面会不断变化。
因此,显而易见的事情是,在片段着色器中,如果我正在处理选定的面,请在此位图上调用 texture2D(),如果我在未选择的三角形中,请使用那个。只是,我看不到从片段着色器中找出我所在的三角形的方法。这是我的问题:我能知道吗?
我确实有一个替代方案——用自己的顶点副本设置每个面,将纹理位图的大小加倍,在每个面的顶点上设置 UV 坐标以指向“选定”或“取消选定”部分位图——但是顶点的数量增加了 6 倍,而且我每帧都将一个全新的 UV 数组传递给 GPU,而且……是的。明显慢,即使在小物体上也是如此。不好。