Eyeshot 11.847仅首个OverlayItem被填充其余未渲染问题求助
运行环境
- Eyeshot 11.847
问题现象
叠加层填充逻辑执行时,仅第一个OverlayItem能成功绘制填充,预期所有小圆都应完成填充。调试确认所有待渲染OverlayItem都已进入渲染代码块,但最终只有单个元素被填充。
问题效果截图:
涉及的核心渲染代码:
internal sealed class ViewportOverlayDrawer : IOverlayItemVisitor { private readonly RenderContextBase _renderContext; public void Visit(OverlayItem item) { if (!item.IsVisible || item.Vertices == null || item.Vertices.Length == 0) { return; } var points = item.Vertices.Select(vertex => new Point3D(vertex.X, _viewportLayout.RealHeight - vertex.Y, 0.0)).ToArray(); if (item.BrushColor != Color.Empty) { _renderContext.SetState(blendStateType.Blend); _renderContext.SetColorWireframe(item.BrushColor); _renderContext.DrawTrianglesFan(points, Vector3D.AxisZ); _renderContext.SetState(blendStateType.NoBlend); } } }
故障原因
问题出在DrawTrianglesFan的绘制逻辑上:
- 该方法不会自动在每次调用时重置三角形扇的图元装配起点,连续多次调用时,后续传入的所有顶点会被默认拼接到上一个三角形扇的顶点序列中,作为同一个图元处理。
- 三角形扇的拓扑规则要求第一个顶点为扇面中心点,后续顶点按顺序和中心点、前一个顶点组成三角面。每次传入的都是独立小圆的完整顶点集,从第二个
OverlayItem开始传入的顶点,会被当作第一个三角形扇的后续顶点,根本无法组成合法的闭合填充面,最终只有第一个传入的小圆能被正常渲染填充。
修复方法
每次调用DrawTrianglesFan绘制完单个图形后,显式调用EndPrimitive()方法提交当前图元批次,强制结束当前三角形扇的装配,保证下一次绘制时会从新的顶点序列开始组装独立的三角形扇:
if (item.BrushColor != Color.Empty) { _renderContext.SetState(blendStateType.Blend); _renderContext.SetColorWireframe(item.BrushColor); _renderContext.DrawTrianglesFan(points, Vector3D.AxisZ); // 显式结束当前图元批次,截断顶点序列 _renderContext.EndPrimitive(); _renderContext.SetState(blendStateType.NoBlend); }
如果当前使用的Eyeshot版本不支持直接调用EndPrimitive(),可以在每次绘制前显式调用BeginPrimitive(primitiveType.TriangleFan)开启独立图元批次,和EndPrimitive()成对包裹单图形绘制逻辑,效果一致。
内容的提问来源于stack exchange,提问作者Voltara
相关产品推荐
相关产品推荐

