WebGL:使用索引缓冲区绘制球体网格时的顶点偏移问题问询
解决方案:只使用pointsArray中球体网格的顶点
嘿,这问题我之前也碰到过——当顶点数组里混了旧数据,又不想重新生成索引缓冲区的时候,有两个简单的办法能解决,看你更倾向哪种:
方法1:调整索引缓冲区的偏移量
这是最直接的方式,不用动原顶点数组,只需要给索引加上球体顶点的起始偏移值:
- 记录球体顶点的起始位置:在生成球体网格之前,先把当前pointsArray的长度存下来,这个就是球体顶点的起始索引:
// 生成球体前,记录现有顶点数量 int sphereVertexStart = pointsArray.Count; // 这里是你生成球体顶点的代码,把顶点添加到pointsArray里 GenerateSphereVertices(pointsArray);
- 修正索引缓冲区的数值:遍历你的索引数组,给每个索引值加上刚才记录的
sphereVertexStart,这样索引就会指向pointsArray里属于球体的那部分顶点了:
// 假设你的索引缓冲区是int[] indices; for (int i = 0; i < indices.Length; i++) { indices[i] += sphereVertexStart; }
这样绘制的时候,索引就不会再访问之前的旧顶点了。
方法2:提取球体顶点到独立数组
如果你不想修改原索引缓冲区,可以把pointsArray里的球体顶点单独拎出来,用这个新数组配合原索引绘制:
- 提取球体顶点:还是先记录起始位置,然后截取数组的后半部分:
int sphereVertexStart = pointsArray.Count; GenerateSphereVertices(pointsArray); // 提取球体顶点到新数组 List<Vector3> sphereVertices = pointsArray.GetRange(sphereVertexStart, pointsArray.Count - sphereVertexStart);
- 用新顶点数组绘制:绘制的时候,把这个
sphereVertices作为顶点缓冲区的数据源,原索引缓冲区不用改,因为它本来就是基于球体顶点从0开始的顺序。
额外提示
如果之后还要修改成树叶形态,建议你把不同部分的顶点数据分开管理(比如用不同的List存储旧顶点、球体顶点),这样后续调整的时候更清晰,不会再出现索引混乱的问题。
内容的提问来源于stack exchange,提问作者M. Rosenlof
相关产品推荐
相关产品推荐

