Abstractuniform : st_entity 数据
节点ID node ID
inside实例化矩阵数组,每个内部实例一个矩阵
storage array 每个instance的st_instance_info size 1、每个instance的结构大小 ,st_instance_info 大小=16 2、instance数量(M=1,动态,程序中)
storage array(初始化默认一个矩阵,即一个instance) 每个instance的world matrix大小(固定的) 1、matrix以16byte一个单位计算,16 byte 2、instance数量 3、2个矩阵,分别是world矩阵和逆矩阵
初始化矩阵
节点名称 node name
四元数
节点是否以及GPU准备好 node is ready of GPU
任意点的任意轴的罗德里格斯旋转(考虑_position位置) 1、数组第一个元素为旋转点,第二个元素为旋转轴 2、数组第三个元素为旋转角度 3、数组第四个元素为是否在世界坐标下旋转
旋转:自身原点为中心( 不,考虑_position位置)
透明属性 , 默认=false, 通过后续材质或函数设置
uv动画使用
VS bind group
VS bind group layout
DrawCommand 生成器
这里指的是颜色前向,光影延迟
for shader
实例化数组最后重新的时间 ,有stride(256byte)存在,外部实例化数量改变时,可能不需要renew
是否外部实例化数量改变 ,只标记是否有数量变化
内部实例化数量,默认为1
实体类型
顶点属性的插值模式
local matrix
当前entity在世界坐标(层级的到root),可以动态更新 1、在directInWorldSpace为true时,matrixWorld与matrix相同 2、在directInWorldSpace为false时,matrixWorld为matrix的累计乘积
MSAA
是否需要更新本地矩阵
是否用户自定义更新函数
是否用户自定义更新函数,在update()函数最后调用
OIT的tag
外部实例化数组 说明: 1、由EntityManager.add()指向赋值:entity.outSideInstance = instances; 2、checkStorageBuffer() 检查是否需要更新storage buffer 3、updateSelf() 中调用, this.updateUniformCommonEntity(clock); //更新vs、fs的uniform this.updateInstanceBuffer(); //更新instance buffer this.updateWorldMatrixBuffer(clock); //更新world matrix buffer this.updateMorphtTargetBuffer(); //更新morphtarget buffer this.updateJointMatrixBuffer(); //更新joint matrix buffer 进行与instance相关的更新 4、getInstancesCount() 获取实例化数量:内外部
外部实例化数组stride数量,默认为4 1、storage和uniform的offset stride都是256byte 2、为什么是4:简单以矩阵为测算依据(每个矩阵16byte,4x4矩阵常用,而且是常用中最大的类型),64*4=256byte,所以4个4x4的矩阵为一个stride。
上一帧外部实例化数量
for shader
storage buffer 列表 1、instances 实例化数组 2、wolrdMatrix 世界矩阵数组
storage buffer 偏移量最小值,默认为256byte
节点类型 node type
uniform buffer 偏移量最小值,默认为256byte
节点UUID node UUID
顶点buffer 列表:有DCG生成的顶点buffer和index buffer 1、有DCG写入
顶点偏移量,材质编辑器适用,目前(20260103)未使用
在世界坐标下的位置(x,y,z)
获取是否透明
设置是否透明
20260322,todo,取消cameraDC中的按照id排序 检查camear的id在commands中是否已经存在
检查内部instance是否合法
检查是否需要更新矩阵 这里是TRS
Abstractcheck可见性(visible)、 可用性(enable)、 初始化状态(_state) 上级group的状态(可见性、使用性)
检查相关storage buffer的状态,根据instance数量进行创建、更新或保持。
1、preUpdate 中调用
2、目前uniform 和 storage的offset 最小值为256byte
buffer list
清除DCC 渲染队列
创建绘制命令
Abstractcreate前向渲染 不透明
Abstractcreate渲染shadowmap 不透明
Abstractcreate渲染shadowmap 透明模式
Abstractcreate透明渲染
AbstractdetachAbstractgenerate生成原始包围盒和原始包围球
todo:20260322,这里需要BOL改造 生成bind group 的entries
GPUBindGroupEntry[]
生成内部instance的矩阵,涵括内部instance的position,rotate,scale等
Mat4[] 内部instance的矩阵
获取bindGroup和bindGroupLayout。由DCG.initUniformPart() 和BaseDrawCommand.doEncoder()调用 时间轴:render阶段
I_bindGroupAndGroupLayout
获取bind group 的binding,固定的与shader中的顺序对应 说明: 1、bufferGPU使用的对象,没有使用Map。原因是需要有通用的占位Storage buffer,直接指向对象可以共享占位GPUBuffer。 2、对象不能保障顺序,所以需要一个单独绑定的顺序。
number
Abstractget获取混合模式
Abstractget判断在camera或light的可见性 ,并获取实例化的drawMode数组
OptionalwireFrameDrawModeTemplate: I_drawModeIndexed | I_drawModeAbstractget获取每个实例的drawMode数组 ,透明渲染使用
获取内部instance的矩阵
内部instance的索引
内部instance的矩阵
获取instance总数量:内部instance*外部instance
number
获取instance总数量:内部instance*外部instance
number
获取实例的世界矩阵,不更新entity的worldPosition 1、entity的matrixWorld 是单位矩阵 2、返回instance的世界矩阵
实例
instance 世界矩阵
获取字符串化的顶点属性的插值模式 :cache shader module ,pipeline使用
Abstractget获取是否透明
获取uniformCommonEntityInfo 基础信息,st_entity_instances.vs.wgsl
获取用户自定义的shader代码
string
预先更新处理: 1、在ECS中调用,判断是否执行update() 2、判断是否有外部实例数量变化, A、检查storage pointer的更新
时钟
Abstractready三段式初始化的第三步:readyForGPU 当前对象的GPU已经可以用时,执行此调用。 when GPU is ready, call this function
绕任意轴旋转
绕X轴(1,0,0)旋转
绕y轴(0,1,0)旋转
绕z轴(0,0,1)旋转
scale
替换pos的位置(matrix的:12,13,14),其他的matrix数据不变, 将entity的位置变为POS,等价wgpu-matrix的mat4的translation,是替换,不是增加
:Vec3
在现有matrix(原有的position)上增加pos的xyz, 将entity的矩阵应用POS的位置变换,是在原有矩阵上增加
:Vec3
创建单位矩阵,矩阵的xyz(12,13,14)=pos
:Vec3
更新|初始化实例化数组
1、矩阵操作一般来说: CPU中:SRT(右乘),行向量列矩阵=行向量 GPU中: TRS(左乘),列矩阵列向量=列向量
2、更新矩阵的顺序是先进行线性变换,再进行位置变换。其实是没有影响,线性工作在3x3矩阵,位置变换在[12,13,14],列优先。
3、旋转部分,四元数优先,然后后轴旋转。 A、在模型gltf中,旋转使用四元数。
更新entity的自定义属性 1、更新entity的uniform 通用 2、更新entity的instance buffer 3、更新entity的world matrix buffer 4、更新entity的morphtarget buffer 5、更新entity的joint matrix buffer 6、检查是否有新摄像机,有进行更新 7、检查是否有新光源,有进行更新 8、DCG的uniform更新
时钟
被update调用,更新vs、fs的uniform
this.flagUpdateForPerInstance 影响是否单独更新每个instance,使用用户更新的update()的结果,或连续的结果
更新|初始化 world matrix 数组(cpu and gpu) 1、生成所有的instance 的矩阵,连续的,不考虑可见性与可用性;后期增加判断,避免重复计算
Optional_clock: ClockOptional_matrixWorld: Float32Array<ArrayBufferLike>
剔除模式 默认=back