unity code 更新gpuinstance数据

添加数据:

在MaterialPropertyBlock.cpp中有AddPropertyTexture,AddPropertyFloat以及ReplacePropertyTexture,ReplacePropertyColor等可以更改m_Buffer这个dynamic_array<float>类型的数据,以及m_Properties这个dynamic_array<Property>类型的数据。

 

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();

直接执行顶点和片元。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值