unity code-vbo渲染的方式

unity在不同的平台用不同的渲染指令执行渲染。

vbo的两种组织方式:

动态渲染的执行时会通过VBO的执行方式去组织。有两种vbo的方式:

DynamicVBO:

第一种是通过DynamicVBO& vbo = m_Device->GetDynamicVBO();拿到不同平台的vbo对接接口类。DynamicVBO在各个不同平台执行不同的动态vbo方式。这种一般是可以做合批的方式。底层用

第二种是通过ClientDeviceVBO* vbo = stream.ReadValueType<ClientDeviceVBO*>();这种跟上面第一种不同,他是直接存储单个物体的vbo渲染。底层用VBO的类做渲染。

地址更新方式的流缓存VBO:

vbo关键是DrawVBO,直接通过vbo渲染物体,当然也有更新数组,MapBuffer之类的。

基于DynamicVBO的方法的组织:

基于DynamicVBO这个类的关键是GetChunk,ReleaseChunk,DrawChunk三个接口来组织vbo来渲染。他是通过channel来获取vbo的buffer,然后在三个方法里面执行渲染的批次。

GetChunk:

GetChunk里面有包括整个数据的格式大小,顶点数组大小,索引数组大小,顶点buffer,索引buffer。并最终在m_CurVertexBuffer,m_CurIndexBuffer,m_CurStride之类的地方存储。

ReleaseChunk:

如果是gles3:

然后ReleaseChunk里面通过FlushMappedRange,实际FlushMappedRange里面是通过glFlushMappedBufferRange来让客户端的数据更新到buffer数据中,也就相当于刷新vbo的数据了而不用切换vbo。m_CurVertexBuffer和m_CurIndexBuffer都是这样做的。

gles2的话:

他是通过重新绑定vbo来实现的。也就是执行glBindBuffer和glBufferData来重新设置数据。

DrawChunk:

后续要用到的DrawChunk通过ComputeVertexInputState(vertexInputState, channels);将channels这个频道下的用到的类型,比如normal,position之类的设置到vertexInputState中。然后在SetupDefaultVertexArrayStateGLES30拿到vertexInputState的设置然后通过glVertexAttribPointer来激活通道。

然后通过glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_CurIndexBuffer->GetBuffer())绑定索引数据。然后根据不同的类型,比如GL_TRIANGLES,GL_TRIANGLE_STRIP等方式执行glDrawElements。

dx11的话是直接通过ctx->Draw或者ctx->DrawIndexed直接提交的,因为他是imr的,立即渲染。

dx9是执行dev->DrawIndexedPrimitive。

Cleanup:

然后DynamicGLES3VBO::Cleanup就是清除之前的所有buffer了。

 

流方式的VBO方式:

MapVertexStream是组织顶点流到outData中。

UpdateIndexData是通过copy的方式让顶点索引更新。

UpdateVertexData是通过拷贝地址让buffer更新

DrawVBO是让顶点和索引等的地址拷贝到我们的quadIndices中。然后RecreateWithData来重新绑定顶点索引。然后执行Draw,Draw里面如果有vao则绑定vao,如果没有则直接绑定vbo和ebo。最终通过glDrawElements的方式执行。

使用的地方:

如果是一些比如VideoPlay,窗口更新,SkinOnGPU会用到流VBO,静态批处理好像也是用他的。

如果是动态批处理一些合批的方式用DynamicVBO,比如Flare,HaloManager,SpiteRenderer,ParticleRenderer都会用他。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值