问题遇到的现象和发生背景
使用vite-plugin-cesium版方法实现了3dtiles渐变效果(https://blog.csdn.net/qq_42425561/article/details/127617840?spm=1001.2014.3001.5501)
遇到的现象和发生背景,请写出第一个错误信息
但是在后续调用viewer.scene.pick方法时出现的报错
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
tile.tileVisible.addEventListener(function (res) {
let content = res.content;
let featuresLength = content.featuresLength;
for (let i = 0; i < featuresLength; i += 2) {
let feature = content.getFeature(i);
let model = feature.content._model;
if (model && model._pipelineResources) {
let program = model._pipelineResources[1];
const color = `vec4(0,187.5/255.,1.,1.)`;
program._fragmentShaderSource.sources[0] = `
uniform vec2 model_iblFactor;
uniform mat3 model_iblReferenceFrameMatrix;
uniform float model_luminanceAtZenith;
uniform float u_metallicFactor;
uniform float u_roughnessFactor;
uniform int model_featuresLength;
uniform sampler2D model_batchTexture;
uniform vec4 model_textureStep;
vec4 model_textureDimensions = vec4(1.0);
uniform float model_colorBlend;
uniform bool model_commandTranslucent;
uniform sampler2D model_pickTexture;
in vec3 v_positionWC;
in vec3 v_positionEC;
in vec3 v_normalEC;
in vec3 v_positionMC;
in float v_featureId_0;
struct SelectedFeature
{
int id;
vec2 st;
vec4 color;
};
struct FeatureIds
{
int featureId_0;
};
vec2 computeSt(float featureId)
{
float stepX = model_textureStep.x;
float centerX = model_textureStep.y;
#ifdef MULTILINE_BATCH_TEXTURE
float stepY = model_textureStep.z;
float centerY = model_textureStep.w;
float xId = mod(featureId, model_textureDimensions.x);
float yId = floor(featureId / model_textureDimensions.x);
return vec2(centerX + (xId * stepX), centerY + (yId * stepY));
#else
return vec2(centerX + (featureId * stepX), 0.5);
#endif
}
void selectedFeatureIdStage(out SelectedFeature feature, FeatureIds featureIds)
{
int featureId = featureIds.SELECTED_FEATURE_ID;
if (featureId < model_featuresLength)
{
vec2 featureSt = computeSt(float(featureId));
feature.id = featureId;
feature.st = featureSt;
feature.color = texture(model_batchTexture, featureSt);
}
else
{
feature.id = model_featuresLength + 1;
feature.st = vec2(0.0);
feature.color = vec4(1.0);
}
#ifdef HAS_NULL_FEATURE_ID
if (featureId == model_nullFeatureId) {
feature.id = featureId;
feature.st = vec2(0.0);
feature.color = vec4(1.0);
}
#endif
}
SelectedFeature selectedFeature;
out vec4 vFragColor;
void main(){
vec4 position = czm_inverseModelView * vec4(v_positionEC,1.);//获取模型的世界坐标
float buildMaxHeight = 150.0;//建筑群最高高度 配渐变色
float buildMaxLightHeight = 300.0;//建筑群光圈运动最大高度
vFragColor = ${color};//赋予基础底色
vFragColor *= vec4(vec3(position.y / buildMaxHeight ), 1.0);//根据楼层高度比例渲染渐变色
float time = abs(fract(czm_frameNumber / 360.0)-0.5)*2.;//动画频率 约束在(0,1) 更改频率修改360.0
float diffuse = step(0.005, abs(clamp(position.y / buildMaxLightHeight, 0.0, 1.0) - time));//根据帧数变化,光圈颜色白色,由底部朝上一丢丢(0.05)开始逐渐上移显现.
vFragColor.rgb += vFragColor.rgb * (1.0 - diffuse );//单纯叠加颜色 感兴趣的可以mix混合下
}
`;
}
}
});
运行结果及详细报错内容
渲染效果没有问题,但是一旦调用viewer.scene.pick方法就会报错,导致地图的点击事件无法使用,但只要把该图层隐藏就能够正常调用viewer.scene.pick方法