在cesium中,一个地形瓦片,无论加多少层,都是在一个shader中计算的。
在每个ImagerLayer创建影像纹理时候,会往地形Tile中imagery数组中添加TileImagery。比如加了4个layer层,在一个2_1_0瓦片每个layer层都会附加3张TileImagery,那么这个地形Tile的imagery数组里将会存储12张纹理。那么就要看一下,在创建这个地形瓦片的时候,总共16个纹理单元,应该不会全用上吧?
在addDrawCommandsForTile方法中,会先读取纹理单元最大数量,一般是16个。然后再分析一下是否添加反射、水波纹等等,因为这些也需要占纹理单元,要为他们留出空间,这样一去除,一个drawCommand可能最多能用的只有十一二个纹理单元了。
从地形tile中取出我们的imagery数组,从头开始遍历,以maxTextures为最大值,把没有ready好的和所属layer的透明度是0的imagery过滤掉,以这些纹理构造成一个drawcommand。如果还有没画完的,那就继续再造一个drawcommand,直到把所有imagery都使用完。
const imageryLen = tileImageryCollection.length;
while (numberOfDayTextures < maxTextures && imageryIndex < imageryLen) {
// 读取每个imagery里面的与texture相关的变量放到uniformMapProperties中
// 设置command的uniformMap、shaderProgram等属性
// 构造好command后放到frameState.commandList中
} while (imageryIndex < imageryLen);
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点