Abstract剔除模式 默认=back
drawMode 模板,保存drawMode的模板,后续实例化时使用
是否支持动态attribute数据
uniform : st_entity 数据
mesh的geometry内部对象,获取attribute使用
节点ID node ID
inside实例化矩阵数组,每个内部实例一个矩阵
storage array 每个instance的st_instance_info size 1、每个instance的结构大小 ,st_instance_info 大小=16 2、instance数量(M=1,动态,程序中)
storage array(初始化默认一个矩阵,以适配没有morph target的通用情况;) 1、默认大小:44=16 byte(即4个position,一般默认是4个,也可以多。webgpu默认attribute:16个,vertex buffer:8个) 2、size计算= M*(N4) A、instance 数量(M=1,动态,程序中) B、一个顶点的morphTarget数量N ;一般情况为4个,即大小=Nf32Size=4*4=16 byte
storage array(初始化默认一个矩阵,即一个instance) 每个instance的world matrix大小(固定的) 1、matrix以16byte一个单位计算,16 byte 2、instance数量 3、2个矩阵,分别是world矩阵和逆矩阵
mesh的material内部对象,获取uniform、bindingroup字符串、SHT等使用
初始化矩阵
变形目标数量 1、由checkMorphTargetCount() 检查并设置 2、checkMorphTargetCount()由class MorphTargetAnimation 调用
节点名称 node name
四元数
节点是否以及GPU准备好 node is ready of GPU
任意点的任意轴的罗德里格斯旋转(考虑_position位置) 1、数组第一个元素为旋转点,第二个元素为旋转轴 2、数组第三个元素为旋转角度 3、数组第四个元素为是否在世界坐标下旋转
旋转:自身原点为中心( 不,考虑_position位置)
透明属性 , 默认=false, 通过后续材质或函数设置
uv动画使用
动态更新顶点数据和索引数据的标志位 1、更新后,this.getDrawModeTemplate()需要重新生成drawMode数据,因为长度可以变化了
可见的实例ID数组,每帧更新
顶点数据
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)
获取变形目标数量
设置变形目标数量 1、设置_morphTargetWeightsCount 2、设置_instanceMorphTargetByteSize 3、设置storageBufferList[2].byteSize 4、检查storageBuffer是否匹配
获取是否透明
设置是否透明
20260322,todo,取消cameraDC中的按照id排序 检查camear的id在commands中是否已经存在
检查内部instance是否合法
检查变形目标数量是否匹配,检查attribute中position*的数量 ,并设置_morphTargetWeightsCount
检查是否需要更新矩阵 这里是TRS
状态检查,是否已经完成初始化。updateSelf()中调用
是否完成初始化
检查相关storage buffer的状态,根据instance数量进行创建、更新或保持。
1、preUpdate 中调用
2、目前uniform 和 storage的offset 最小值为256byte
buffer list
清除DCC 渲染队列
创建绘制命令
为每个camera创建前向渲染的DrawCommand
VS shader 模板
为每个light创建阴影映射的DrawCommand 注意: 1、目前VS的SHT,只使用了一个通用的SHT_MeshShadowMapVS
VS shader 模板
渲染shadowmap 透明模式
为mesh创建透明渲染的DrawCommand,包含TO、TT、TTP、TTPF. lines和points 需要override该方法。
按照实例ID bundle数据,填充drawMode数组
生成boundingBox和boundingSphere,基于当前entity的原始包围盒和原始包围球,不涉及变换
todo:20260322,这里需要BOL改造 生成bind group 的entries
GPUBindGroupEntry[]
mesh 生成DrawCommand的input value 1、透明材质的entity使用 2、shadowmap的entity使用
是否只渲染顶点
Optionalscope: EntityBundleMaterialIV_DrawCommand
生成内部instance的矩阵,涵括内部instance的position,rotate,scale等
Mat4[] 内部instance的矩阵
生成opacity DC,并push到对应队列
1、支持的类型: A、不透明 B、TO
2、生成类型 A、MSAA+infor B、MSAA defer+info C、defer D、forward
Optional_material: BaseMaterialtodo :20260209 需要适配动画复合类型:124的权限组合(shader也需要适配) 获取动画类型
获取bindGroup和bindGroupLayout。由DCG.initUniformPart() 和BaseDrawCommand.doEncoder()调用 时间轴:render阶段
I_bindGroupAndGroupLayout
获取bind group 的binding,固定的与shader中的顺序对应 说明: 1、bufferGPU使用的对象,没有使用Map。原因是需要有通用的占位Storage buffer,直接指向对象可以共享占位GPUBuffer。 2、对象不能保障顺序,所以需要一个单独绑定的顺序。
number
获取blend状态 20251008,目前获取blend的状态不在使用此function
获取当前entity的原始包围盒的最大尺寸 ,cubeUV使用
获取实例化的drawMode数组 1、DC 进行实例化优化使用 2、DC获取的是动态的数组,提交instance index 根据可见性进行剔除,需要保持 instance index的编号与entityManager中的Map的instance数组下标一致(涉及storage buffer array)
entity's UUID
渲染类型(相机、light)
OptionalwireFrameDrawModeTemplate: I_drawModeIndexed | I_drawModewireFrame 模式的drawMode模板
I_drawMode[] | I_drawModeIndexed[]
按照每个实例,获取drawMode数组。透明实体使用
获取内部instance的矩阵
内部instance的索引
内部instance的矩阵
获取instance总数量:内部instance*外部instance
number
获取instance总数量:内部instance*外部instance
number
获取实例的世界矩阵,不更新entity的worldPosition 1、entity的matrixWorld 是单位矩阵 2、返回instance的世界矩阵
实例
instance 世界矩阵
获取字符串化的顶点属性的插值模式 :cache shader module ,pipeline使用
从材质获取是否为透明材质
boolean
获取uniformCommonEntityInfo 基础信息,st_entity_instances.vs.wgsl
获取用户自定义的shader代码
string
是否是变形目标动画 说明: 1、不太可能同时有变形目标动画和骨骼动画,仅作为可能判断 2、keyFrame动画:目前共用了MatrixWorld进行,故不设置:1的动画类型 3、其他类型,目前未开始,暂时不设置(GPU shader相同)。
是否是骨骼动画 说明: 1、不太可能同时有变形目标动画和骨骼动画,仅作为可能判断 2、keyFrame动画:目前共用了MatrixWorld进行,故不设置:1的动画类型 3、其他类型,目前未开始,暂时不设置(GPU shader相同)。
预先更新处理: 1、在ECS中调用,判断是否执行update() 2、判断是否有外部实例数量变化, A、检查storage pointer的更新
时钟
三段式初始化的第三段 覆写 Root的function,因为材料类需要GPUDevice
绕任意轴旋转
绕X轴(1,0,0)旋转
绕y轴(0,1,0)旋转
绕z轴(0,0,1)旋转
scale
Optionaloption: { stride?: number; wireFrame?: boolean }替换pos的位置(matrix的:12,13,14),其他的matrix数据不变, 将entity的位置变为POS,等价wgpu-matrix的mat4的translation,是替换,不是增加
:Vec3
更新顶点数据,
1、如果是数组形式,直接更新
2、如果是I_vsAttribute,更新data
3、其他暂时不支持,没有必要
顶点数据的名称
顶点数据
Optionaloption: { stride?: number; type?: "uint32" | "float32" | "int32" }顶点数据的类型和步长
在现有matrix(原有的position)上增加pos的xyz, 将entity的矩阵应用POS的位置变换,是在原有矩阵上增加
:Vec3
创建单位矩阵,矩阵的xyz(12,13,14)=pos
:Vec3
初始化或更新动画buffer
更新|初始化实例化数组
1、矩阵操作一般来说: CPU中:SRT(右乘),行向量列矩阵=行向量 GPU中: TRS(左乘),列矩阵列向量=列向量
2、更新矩阵的顺序是先进行线性变换,再进行位置变换。其实是没有影响,线性工作在3x3矩阵,位置变换在[12,13,14],列优先。
3、旋转部分,四元数优先,然后后轴旋转。 A、在模型gltf中,旋转使用四元数。
morph target update 如果没有morph target,使用默认的storage buffer占位
更新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>
动画类型 :Set<E_AnimationType>