У меня есть муар проблема отображения миллионов точек по цезию, как это решить? - PullRequest
0 голосов
/ 29 апреля 2020

Я использую геометрию для отображения миллионов точек по цезию. Но когда я увеличиваю или меняю статус камеры. это происходит, чтобы иметь муар. я попытался изменить float32array на float64array и установить точность highp float в glsl как в vs, так и в fs. все еще не работает. как решить эту проблему?

вот мой результат рендеринга:

рендер результат1

рендеринг результат *

вот мой код:

     createPoints: function (option) {
            if (!option) return;
            var color = option.color ? option.color : Cesium.Color.WHITE
            var data = Array.isArray(option.data) ? option.data : {}
            if(data.length==0)return null;
            var size = isNaN(option.size)?'1.0':parseFloat(option.size).toFixed(1);
            var cartesians = Cesium.Cartesian3.fromDegreesArray(data);

            var postionsTemp = [];
            // var colorsTemp = [];
            var indicesTesm = [];
            for (var i = 0; i < cartesians.length; i++) {
                postionsTemp.push(cartesians[i].x);
                postionsTemp.push(cartesians[i].y);
                postionsTemp.push(cartesians[i].z);
                // colorsTemp.push(color.red);
                // colorsTemp.push(color.green);
                // colorsTemp.push(color.blue);
                // colorsTemp.push(color.alpha);
            }
            var positions = new Float64Array(postionsTemp);
            // var colors = new Float32Array(colorsTemp);

            var config = {
                attributes: {
                    position: new Cesium.GeometryAttribute({
                        componentDatatype: Cesium.ComponentDatatype.DOUBLE,
                        componentsPerAttribute: 3,
                        values: positions
                    })
                },
                boundingSphere: Cesium.BoundingSphere.fromVertices(positions),
                primitiveType: Cesium.PrimitiveType.POINTS,
            };
            // config.attributes.color = new Cesium.GeometryAttribute({
            //     componentDatatype: Cesium.ComponentDatatype.FLOAT,
            //     componentsPerAttribute: 4,
            //     values: colors
            // });
            var geometry = new Cesium.GeometryInstance({
                id: option.id ? option.id : new Date().getTime(),
                geometry:
                    new Cesium.Geometry(config)
            });

            var primitive = new Cesium.Primitive({
                geometryInstances: [geometry],
                appearance: new Cesium.Appearance({
                    renderState: {
                        // blending: Cesium.BlendingState.PRE_MULTIPLIED_ALPHA_BLEND,
                        // depthTest: { enabled: true },
                        // depthMask: true
                    },
                    vertexShaderSource:
                        `precision highp float;
                        attribute vec3 position3DHigh;
attribute vec3 position3DLow;
varying vec4 v_color;
attribute float batchId;
void main()
{
vec4 p = czm_computePosition();
v_color =vec4(`+color.red+`,`+color.green+`,`+color.blue+`,`+color.alpha+`);
p = czm_modelViewProjectionRelativeToEye * p;
gl_Position = p;
gl_PointSize=`+ size + `;` + `
}
`,
                    fragmentShaderSource:
                        `
                        precision highp float;
                        varying vec4 v_color;
void main()
{
 float d = distance(gl_PointCoord, vec2(0.5,0.5));
 if(d < 0.5){
    gl_FragColor = v_color;
 }else{
    discard;
 }
}
`
                })


            });

            window._cesium.scene.primitives.add(primitive);
            return primitive;
        }
...