节点ID node ID
mipmap设置
节点名称 node name
节点是否以及GPU准备好 node is ready of GPU
blending混合的状态interface
1、如果是undefined,说明不混合 2、如果是object,说明混合
透明材质是否有alpha透明的部分 ,是否有BLEND。 两种情况: 1、使用统一的透明度(opacity) 2、使用来自texture的透明度(alpha)
VS bind group 1、 key :string 采样E_materialTypeForBindGroup的值 2、不使用[key in E_materialTypeForBindGroup] 的原因: A、不是所有类型会有用到,防止不必要的创建 B、目前TTP、TTPF暂停中;20260419
VS bind group layout
材质的默认绑定组,默认是2
材质的更新命令队列 1、有materialManager调用,每帧更新一次。 2、非必须,比如video材质的External就需要
默认的sampler
材质的sampler是否存在,不存在就创建一个。
默认的2D纹理
默认的3D纹理
CPU端保存uniform对应数据的Bundle载体。 1、kind同WGSL结构体中kind(也直接对应 arraybuffer) 2、value:对应WGSL结构体中value(也直接对应 arraybuffer) 3、extra:对应WGSL结构体中data1,data2(也直接对应 arraybuffer) 4、textureName:对应@group(2) @binding(x) 中的textureName,使用enum对应 5、sampler:隐性(使用默认或自定义)。对应WGSL结构体中sampler(也直接对应 arraybuffer) 6、samplerBindingType:隐性,同sampler 7、texture: ,
是否用户自定义更新函数
是否用户自定义更新函数,在update()函数最后调用
材质的SHT模板,key:材质类型,value:SHT模板。
纹理 !!!这里定义的是any,后续各种材质所需要的纹理根据情况,进行declare
节点类型 node type
材质的uniform数据,ArrayBuffer 视图,完整对应WGSL结构体:struct PBRUniformInput 1、每个属性使用相同的结构体布局 2、kind决定数据类型 kind: i32, //uniform 种类,-1=notUse,0=texture,1=value,2=vs 3、textureChannel: 纹理通道, texture_channel: i32,//E_TextureChannel 纹理通道:-1=user define,0=R,1=G,2=B,3=A,4=RG,5=RB,6=RA,7=GB,8=BA,9=RGB,10=RGBA 4、data1: 用于存储额外数据,如:alphaTest,emissiveIntensity data1: f32, //额外数据1 5、data2:f32, 用于存储额外数据,目前未使用 6、value: 用于存储值,如:albedo,metallic,roughness,ao,emissive value: vec4f,//uniform value,按需匹配textureChannel适用
对应于 gltf 2.0 中的baseColorFactor和baseColorTexture
alpha mode 0=opacity,1=alphaTest,2=alphaBlend 对应glTF 2.0 中的 alphaMode 0=OPAQUE,1=MASK,2=BLEND https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_material_alphamode
alphaTest 值(alpha_cut_off) 对应glTF 2.0 中的 alphaCutoff https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_material_alphacutoff
alpha 数据源 -1:不使用,使用albedo 或color 的alpha通道 0:使用value值,f32,r通道 1:使用texture,r通道
对应glTF 2.0 中的 occlusionTexture https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#reference-material-occlusiontextureinfo 遮挡值从红色通道(R 通道)进行线性采样 strength 强度:data1,f32 texCoord 纹理坐标:data2,i32,0=uv0,1=uv1
对应glTF 2.0 中的 emissiveTexture https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#reference-textureinfo texCoord 纹理坐标:data2,i32,0=uv0,1=uv1
todo:20260508 对应glTF 2.0 中的 emissiveFactor,只有数值,没有纹理 https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_material_emissivefactor 默认值为 [0,0,0]
对应于 gltf 2.0 中的metallicFactor和 metallicRoughnessTexture (金属粗糙度纹理,gltf2.0 中是同一个纹理) 金属粗糙度纹理。金属度值从 B 通道采样
对应glTF 2.0 中的 normalTexture
https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#reference-material-normaltextureinfo
texCoord 纹理坐标:data2,i32,0=uv0,1=uv1
scale 缩放:data1,f32,默认1.0
scaledNormal = normalize(
对应于 gltf 2.0 中的roughnessFactor和 metallicRoughnessTexture 粗糙度值从 G 通道采样
材质的uniform数据,ArrayBuffer 大小
材质的uniform Buffer 的指针,用于快速访问
1、PBR、phone需要使用
common的uniform Buffer 的指针,用于快速访问
节点UUID node UUID
获取状态
派生类材质写入uniformcommon
opacity and TO :forward,defer,MSAAInfo 通用
I_bindGroupAndGroupLayout
检查insideUniformBundle是否符合要求 1、如果是纹理,必须有texture 2、如果是值,必须有value
todo: 1、envMap A、envMap需要在system中实现; B、使用IBL,system和shader目前都未实现;
检查是否需要创建bind group 1、如果材质类型不存在,创建 2、pointer 不存在或 rebuild,需要更新bind group 3、如果材质类型存在,但是dynamic texture,创建
Optionaluuid: string1、检查材质的sampler是否存在,不存在就创建一个。 2、设置this._samplerBindingType:GPUSamplerBindingType
IV_BaseMaterial 材质的输入参数
GPUSampler 材质的sampler
检查透明状态,如果是透明的,就设置为透明.(color 透明的除外,需要在color material中验证) 默认:alpha透明,没有设置alphaTest,图像本身alpha=0.0的将透明(diacard) )
IV_BaseMaterial 基础材质的初始化参数
组合shader模板输出
创建uniformcommonPointer
创建uniformPointer
20260402 增加:DC可以获取当前材质的bind group和bind group layout 获取当前材质的bind group和bind group layout
MSAA的需要camera的GBuffer中的texture作为uniform输入,需要指定mergeID。
I_bindGroupAndGroupLayout
获取混合状态
GPUBlendState | undefined 混合状态,undefined表示不混合
获取混合模式: writeUniformCommon()中调用
number 混合模式 0、预乘标准混合 todo:20260517 1、 为A-Buffer设计,目前默认0=预乘标准混合。 2、其他混合模式,目前未设计与实现
按照materialType获取bind group的entry
Optionaluuid: string按照materialType获取bind group layout的layout entry
按照materialType获取bind group的groupAndBindingString
延迟渲染的shader模板输出
OptionalstartBinding: numberI_materialBundleOutput 不包含光影的GBuffer,但GBuffer的输出中需要按照延迟渲染的约定进行。
获取uniform 和shader模板输出,其中包括了uniform 对应的layout到resourceGPU的map 涉及三个部分: 1、uniformGroups:uniform,一个组的内有多个binding 的uniform。 2、singleShaderTemplateFinal:shader模板输出,包括了shader代码和groupAndBindingString。 3、uniform layout 到ResourceGPU的Map操作
I_materialBundleOutput
MSAA 材质输出shader模板
1、MSAA:只输出color和depth 2、inforForward:输出其他GBuffer信息
获取当前材质的指针的byte size
材质是否已经准备好, 判断两个值, 1、this._readyForGPU:延迟GPU device相关的资源建立需要延迟。 需要其顶级使用者被加入到stage中后,才能开始。 2、this._state:材质自身的初始化是否完成。
true:可以使用,false:需要等待。
是否为透明材质
boolean true:是透明材质,false:不是透明材质
获取透明材质的渲染模式:writeUniformCommon()中调用
number 透明材质的渲染模式
获取用户自定义的shader代码
string
初始化材质 一、两种初始化模式 1、程序化控制模式: A、初始化时可以不传递scene对象,只关注材质参数。 B、scene传递和与其相关的参数在entity的init中,通过调用_material.init() 来初始化。 2、加载场景模式(编辑器,加载): A、初始化时需要传递scene对象。 B、然后使用 await xxx.init(scene) 来初始化,有异步的操作。 二、通过判断this._state,来判断是否已经初始化完成。 三、异步操作说明 1、派生类的redadyForGPU()会有异步操作; 2、texture的加载,url等
场景对象
三段式初始化的第三步:readyForGPU 当前对象的GPU已经可以用时,执行此调用。 when GPU is ready, call this function
正常更新,从上到下
Clock 时钟
是否调用自身的updateSelf(),默认=true 此参数可以方便子类重载时,决定调用的updateSelf()的时间顺序或是否调用updateSelft()
将this.insideUniformBundle数据写入uniform buffer 1、遍历insideUniformBundle,写入uniform buffer(ArrayBuffer) 2、创建uniformGPUBuffer,并写入
写入uniformBuffer
是否动态材质 :video材质的External就需要动态材质