作者:憐海周_472_151 | 来源:互联网 | 2023-10-10 09:41
添加数据:
在MaterialPropertyBlock.cpp中有AddPropertyTexture,AddPropertyFloat以及ReplacePropertyTexture,ReplacePropertyColor等可以更改m_Buffer这个dynamic_array类型的数据,以及m_Properties这个dynamic_array类型的数据。
Property里面是这些数据。
设置指令:
在GfxDeviceClient的SetMaterialProperties,这里接收到数据后形成指令kGfxCmd_SetMaterialProperties,并写入数据到GfxCmdSetMaterialProperties结构体里,数据范围在后面propertyCount这个是属性数量。bufferSize这个是数据长度。
执行的地方和条件:
这个方法会在
MeshRenderer的RenderMultiple
SkinnedMeshRenderer::Render
SpriteRenderer::RenderBatch
LineRenderer::Render
TrailRenderer::Render
ParticleRenderer::Render
ParticleSystemRenderer::RenderBatch
QuadTreeNodeRenderer::Render。
他们都是基于m_CustomProperties这样的MaterialPropertyBlock有数据时才执行,也就是有数据修改时才执行。
执行运行,设置进gfx:
在渲染线程GfxDeviceWorker::RunCommand里面执行kGfxCmd_SetMaterialProperties指令。
可以看到他时拿到属性类型和数据然后组成MaterialPropertyBlock。然后用m_Device->SetMaterialProperties设置到m_MaterialProperties里面。
gles3的执行:
然后如果时gles3的话,这个数据在GfxDeviceGLES30.cpp的BeforeDrawCall里面把数据缓存到STATE.activeProgramParams中。
然后最终更新buffer
cbo更新uniform:
在ConstantBuffersGLES30::UpdateBuffers中更新绑定的uniform数据
dx11:
dx11的话对于更新就简单一点,没那么多指令。在ConstantBuffersD3D11::UpdateBuffers中可以看到
可以看到用UpdateSubresource更新buffer,然后当前帧直接ctx->dxCall。因为走的imr模式,所以直接不担心带宽问题。
dx9
在GfxDeviceD3D9::BeforeDrawCall中直接通过
vscache.CommitVertexConstants();
pscache.CommitPixelConstants();
直接执行顶点和片元。