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

直接执行顶点和片元。

猜你喜欢

转载自blog.csdn.net/llsansun/article/details/122518874