-->

WEB资讯

您的当前位置:首页 > 资讯

绘制对象-Primitive外观

2019-04-23 15:10:58  来源:admin 点击:758

Primitive由两个重要部分组成:几何图形实例(GeometryInstance)、外观(Appearances),一个Primitive只能有一个外观,而可以有多个实例。几何图形定义了结构,外观定义了每个像素被如何着色,外观可能使用材质(Material)。这些对象的关系如下图所示:
Cesium支持下表列出的外观:

 外观
 说明
MaterialAppearance支持各种Geometry类型的外观,支持使用材质来定义着色
EllipsoidSurfaceAppearanceMaterialAppearance的一个版本。假设几何图形与地表是平行的,并且依此来进行顶点属性(vertex attributes)的计算
PerInstanceColorAppearance让每个实例使用自定义的颜色来着色
PolylineMaterialAppearance支持使用材质来着色多段线
PolylineColorAppearance使用每顶点或者每片段(per-vertex or per-segment )的颜色来着色多段线

外观定义了需要在GPU上执行的完整的GLSL顶点、片段着色器,通常不需要修改这一部分,除非需要定义自己的外观。

外观还定义了完整的render state,用于在绘制Primitive时控制GPU的状态,可以直接或者通过高层API来定义render state,下面代码的效果是一样的:

//下面的外观可用于定义一个Viewer不可进入的不透明盒子

        var appearance2 = new Cesium.PerInstanceColorAppearance({

            translucent: false,

            closed: true

        });

        //下面的代码效果同上

        var appearance3 = new Cesium.PerInstanceColorAppearance({

            renderState: {

                depthTest: {

                    enabled: true

                },

                cull: {

                    enabled: true,

                    face: Cesium.CullFace.BACK

                }

            }

        });

效果:

Cesium学习笔记17--绘制对象-Primitive外观

一旦外观被创建,其render state就不可再变,但是其材质是可以替换的。另外Primitive的外观也是不可修改的。

大部分外观具有flat、faceForward属性,可以间接的控制GLSL 着色器:

  1. (1)flat:扁平化着色,不考虑光线的作用

  2. (2)faceForward:布尔值,控制光照效果

Geometry与Appearance的兼容性

需要注意,不是所有外观和所有几何图形可以搭配使用,例如EllipsoidSurfaceAppearance与WallGeometry就不能搭配,原因是后者是垂直于地表的。

即使外观与几何图形兼容,它们还必须有匹配的顶点格式(vertex formats)—— 即几何图形必须具有外观可以作为输入的数据格式,在创建Geometry时可以提供VertexFormat。

为了简便,可以让Geometry计算所有顶点属性(vertex attributes),以使之适用于任何外观,但这样做效率较差:

var geometry = new Cesium.RectangleGeometry( {

    vertexFormat : Cesium.VertexFormat.ALL

} );

而如果我们使用外观EllipsoidSurfaceAppearance,其实只需要知道位置:

var geometry = new Ceisum.RectangleGeometry( {

    vertexFormat : Ceisum.VertexFormat.POSITION_ONLY

} );

大部分外观具有vertexFormat属性或者VERTEX_FORMAT 静态常量,创建形状时只需要使用这些顶点格式即可:

var geometry = new Ceisum.RectangleGeometry( {

    vertexFormat : Ceisum.EllipsoidSurfaceAppearance.VERTEX_FORMAT

} );

var geometry2 = new Ceisum.RectangleGeometry( {

    vertexFormat : Ceisum.PerInstanceColorAppearance.VERTEX_FORMAT

} );

var appearance = new Ceisum.MaterialAppearance();

var geometry3 = new Ceisum.RectangleGeometry( {

    vertexFormat : appearance.vertexFormat

} );

此外,两个形状必须具有匹配的vertexFormat,才能被合并到一个Primitive中。


相关文章更多 >

© 2024版权所有 水水网

电话:171780793