Javascript 如何更改铯贴图中椭圆外线几何体的宽度?

Javascript 如何更改铯贴图中椭圆外线几何体的宽度?,javascript,map,webgl,ellipse,cesium,Javascript,Map,Webgl,Ellipse,Cesium,我遵循沙堡椭圆轮廓几何。我想知道是否有办法使椭圆线宽变宽?有使用“宽度”属性使多段线变宽的示例,但似乎没有办法使EllipsOutlineGeometry对象变宽。 sandcastle示例的末尾有一个线宽设置,但对此进行的更改似乎不会影响椭圆轮廓的宽度 沙盒代码: // Create the ellipse geometry. To extrude, specify the // height of the geometry with the extrudedHeight option. /

我遵循沙堡椭圆轮廓几何。我想知道是否有办法使椭圆线宽变宽?有使用“宽度”属性使多段线变宽的示例,但似乎没有办法使EllipsOutlineGeometry对象变宽。 sandcastle示例的末尾有一个线宽设置,但对此进行的更改似乎不会影响椭圆轮廓的宽度

沙盒代码:

// Create the ellipse geometry.  To extrude, specify the
// height of the geometry with the extrudedHeight option.
// The numberOfVerticalLines option can be used to specify
// the number of lines connecting the top and bottom of the
// ellipse.
ellipseOutlineGeometry = new Cesium.EllipseOutlineGeometry({
    center : Cesium.Cartesian3.fromDegrees(-95.0, 35.0),
    semiMinorAxis : 200000.0,
    semiMajorAxis : 300000.0,
    extrudedHeight : 150000.0,
   rotation : Cesium.Math.toRadians(45),
   numberOfVerticalLines: 10
});
// Create a geometry instance using the ellipse geometry
// created above.
var extrudedEllipseOutlineInstance = new Cesium.GeometryInstance({
    geometry : ellipseOutlineGeometry,
    attributes : {
        color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.WHITE)
    }
});

// Add both ellipse outline instances to primitives.
 primitives.add(new Cesium.Primitive({
    geometryInstances : [ellipseOutlineInstance, extrudedEllipseOutlineInstance],
    appearance : new Cesium.PerInstanceColorAppearance({
        flat : true,
        renderState : {
            depthTest : {
                enabled : true
            },
             lineWidth : Math.min(2.0, scene.maximumAliasedLineWidth)  //changes here dont seem to affect the actual size?
        }
    })
}));

我假设您使用的是Windows(稍后您就会知道原因)

为什么
scene.maximumAliasedLineWidth
总是返回1,原因很简单,因为这是web浏览器允许的最大值。这也是使用大于1的值时出错的原因。当然,这个答案只会引出更多的问题;下面是一个更详细的回答

WebGL规范规定,实现支持最小线宽1;并且不要求支持大于1的线宽。实际上,所有OpenGL驱动程序都支持大于1的值;我相信你目前使用的硬件也能做到。但是,Windows上所有主要的WebGL实现实际上都不使用OpenGL

Chrome和Firefox都使用一个名为的库,该库通过DirectX在Windows上实现WebGL。角度本身被认为是一致的实现。因为ANGLE选择只支持1的线宽(我不想解释原因);这意味着Chrome和Firefox都无法在Windows上画出更宽的界线(在这个过程中会让你和许多其他开发者发疯)

InternetExplorer11采用了类似的方法,尽管它们不使用ANGLE,而是有自己的基于DirectX的自定义实现。更糟糕的是,虽然他们只声称支持1的线宽;浏览器本身总是绘制粗线条(看起来在3-5像素宽之间)。所以在IE中不可能没有粗线条

在其他平台上实施;无论是Android、iOS还是Mac操作系统,都没有这个问题。您的源代码片段将在这些平台上绘制厚度为2的线条,在Windows上绘制厚度为1的线条


一个方便的网站,用于了解您的浏览器正在使用的WebGL实现。它可以告诉你是否在使用ANGLE,许多功能的最小值和最大值是多少,以及大量其他信息(只有当你是一名图形程序员时才会关心这些信息)。

我在Windows上使用Firefox。我去确认了这些价值观。但是我用更粗的线渲染多段线(多重几何体),没有任何问题。问题只在于多边形

以上答案都是老生常谈

自2017年初以来,Chrome和Firefox都发布了WebGL2。为了支持WebGL2,他们必须使用OpenGL3.3“核心”配置文件或更高版本。“核心”档案是这样写的

E.2.1已弃用。。。特征
  • 宽行-大于1.0的线宽值将生成
    无效\u值
    错误
如果您只使用WebGL1,那么浏览器仍然使用相同的系统

换句话说,自2017年以来,桌面上几乎不支持粗线条。OpenGL ES规范没有这一行,所以你可以在Android、iOS和类似设备上获得粗行,但基本上你应该假设你不能


要获得粗线条,您需要

实际上,唯一可能的值似乎是1。较大或较小的值会引发WebGL渲染错误
scene.maximumAliasedLineWidth
reference建议检查
glGet(别名线宽度范围)
,但我无法在Sandcastle livecoding界面中调用此方法(我从未直接操作WebGL)…我也收到了WebGL错误,只是假设我没有将此值更改为正确的值。听起来像是马修·阿马托在下面整理出来的。谢谢马修·阿马托的精彩解释。我正在使用Firefox和Windows,这解释了我看到的错误和行为。太棒了。我在Windows上使用Chrome。所以结论是他想做的是不可能的,很遗憾。