You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:09:26