应用场景:
这种方式无法减少被渲染的顶点的数量,但是可以降低带宽的压力,尤其是在绘制大量重复场景的时候具有得天独厚的优势。
原理:
在顶点buffer进入渲染管道的时候,并不是直接送给VS进行渲染,而是进入一个IA阶段。正是因为这个原因,才多了一次对顶点进行二次加工的机会。以下是从IA进入的数据:
IASetIndexBuffer :索引缓冲区绑定到汇编器的输入阶段。
IASetInputLayout :输入布局对象绑定到汇编器的输入阶段。
IASetPrimitiveTopology :绑定信息的基本类型和数据顺序来描述的输入数据输入汇编阶段。
IASetVertexBuffers :顶点缓冲区数组绑定到汇编器的输入阶段。
这里面IB是顶点的索引没啥好说的,PT的定义体元描述顶点绘制的形状的跟这个也没关系。VB是存储顶点的buffer,这里是s说明可以同时传递n个VB和1个IB。关键的是IL对输入的数据格式的定义。
LPCSTR SemanticName; // 这个是定义HLSL中的语义,HLSL就是通过这个语义来识别它。
UINT SemanticIndex; // 这个是语义取重名的时候,用来区分的序号,例如矩阵要描述里面的每一个元素,总不能取不同的名字吧,所以用序号区分
DXGI_FORMAT Format; // 数据格式,它对应HLSL的数据类型
UINT InputSlot; // 输入插槽,设置为0即可
UINT AlignedByteOffset; // 对齐的偏移量,不知道该如何计算,还好只需要设置为:D3D11_APPEND_ALIGNED_ELEMENT就好了
D3D11_INPUT_CLASSIFICATION InputSlotClass; //
UINT InstanceDataStepRate; // 这个值必须为0 - -。
} D3D11_INPUT_ELEMENT_DESC;
typedef enum D3D11_INPUT_CLASSIFICATION { 对应倒数第2个
D3D11_INPUT_PER_VERTEX_DATA = 0, // 输入的是每个顶点的数据
D3D11_INPUT_PER_INSTANCE_DATA = 1 // 输入的是每个实例的数据
} D3D11_INPUT_CLASSIFICATION;
InputSlot和InputSlotClass要对应起来,暂时这么理解的,如果创建INSTANCE的话,InputSlotClass为D3D11_INPUT_PER_INSTANCE_DATA 所以InputSlot也要等于1,暂时这么理解,不一定对。
整个创建INSTANCE最主要的就是把这个地方对应好就行了。
下面给出大致的实现代码:
1.创建instanceBuff:从本质上来讲,它其实就是VB
// 设置索引缓冲描述. instanceBufferDesc.Usage = D3D11_USAGE_DEFAULT; instanceBufferDesc.ByteWidth = sizeof(float3) * mInstanceCount; instanceBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; // 这个比较重要 instanceBufferDesc.CPUAccessFlags = 0; instanceBufferDesc.MiscFlags = 0; instanceBufferDesc.StructureByteStride = 0; // 指向存临时索引缓冲. instanceData.pSysMem = mInstancePos; instanceData.SysMemPitch = 0; instanceData.SysMemSlicePitch = 0; // 创建索引缓冲. device->CreateBuffer(&instanceBufferDesc, &instanceData, &mInstanceBuff);
2.定义语义:
{"INSTANCEPOS",0,DXGI_FORMAT_R32G32B32_FLOAT,1,D3D11_APPEND_ALIGNED_ELEMENT,D3D11_INPUT_PER_INSTANCE_DATA,1}
这里第4个参数为1,说明它是从第二个插槽输入进去的,倒数第二个参数说明它是一个实例的数据,而不是顶点的数据。最后一个参数还不知道干什么用的,写成1是对的。
3.绘制:
immediateContext->IASetVertexBuffers(1, 1, &mInstanceBuff, &stride2, &offset); mContext->DrawIndexedInstanced(indexCount, instanceCount, 0, 0,0);
文档说的不详细,只能靠别人的文章描述,或者自己的经验进行总结。这个暂时这个样了,以后了解的更深刻的时候补充
总结:在学习API的时候,最重要的不是用会了什么,而是了解了作者的意图是什么。只有了解 了作者的意图,你才能把整套API的体系打通。而一套API是否难学,也是看读者是否能够很容易理解作者的意图。VB是一个数据流,而IL是它的格式描述,IA阶段也正是根据IL的描述对VB的数据进行加工的。
相关推荐
我们经常利用GPU Instancing 去实现室外场景,比如草地和树木。但是对于SkinnedMeshRenderer,例如角色,我们是使用不了instancing技术的。因为角色的蒙皮计算通常是在CPU计算的,然后一个一个的提交给GPU渲染。通常...
默认情况下,多个一样的模型会被动态...这里用镜像后的实例模型和GPU Instancing做比较在Unity5.6.2或者之后的版本中,只要材质球勾选Instancing,即自动开启并使用GPU Instancing。 GPUInstancing 的示例,支持动画
用于实现大批量人物渲染的效果,通过将人物动作打包成二进制文件,渲染时候直接使用这个,降低drawcall,提升性能
用于渲染大群体,将动作等资源打包在资源中,优化渲染效果
GPU Instancing可以用来批量绘制大量相同几何结构相同材质的物体,以降低绘制所需的batches。要想在Unity中使用,首先需要至少在shader的某个pass中加上#pragma multi_compile_instancing。 然而,默认的gpu ...
raylib实例化试用raylib的实例渲染支持。 当前包括raylib src,因为对实例化支持需要对进行修改。例子执照有关详细信息,请参见。
Video9.Demo2.Instancing
一次绘制100个矩形,是一种只调用一次渲染函数却能绘制出很多物体的技术,它节省渲染物体 时从CPU到GPU的通信时间,而且只需做一次即可。要使用实例化渲染,我们必须 将 glDrawArrays 和 glDrawElements 各自改 为 ...
Animation Instancing是一种大大减少CPU消耗并且对GPU Instancing的一种补充。你可以在GitHub上获取代码。下载地址: https://github.com/Unity-Technologies/Animation-Instancing 特别说明:这是一个实验性质的...
几何实例化允许有效地呈现多个对象 使用不同的属性(例如不同的变换矩阵, 颜色,或大小)使用单个API调用。 这个特性在渲染中很有用 大量相似的对象,如人群渲染。 几何 实例化减少了发送许多API调用的CPU处理开销
实例化技术马修·拉根(Matthew Ragan) 05.24.20概括好,你好,有更新。 此仓库经过了重大修改,使其成为探索实例化的更好工具,而不仅仅是示例的混搭。 作为一个工具,该项目现在将以执行模式开始,并允许您浏览...
使用GPU实例化减少绘制调用。 使用Unity的AR Foundation在旧版iPhone 7上在现实世界中创建10,000个玩具士兵。 初始版本于2017年7月30日在GitHub上发布,当然,它仍在GitHub上。 但是,如果您能给我买杯咖啡,我会...
UnityURP-MobileDrawMeshInstancedIndirectExample ... 为了演示可以绘制数百万个实例的API,请在移动设备上运行DrawMeshInstancedIndirect()。 该演示可以在中端手机上运行吗? 可以在Samsung Galaxy A70上
– 绘制物体位置信息需要频繁更新并且需要计算碰撞 – 怪物需要频繁的创建与销毁 – Graphics.DrawMeshInstanced*需要维护复杂的数据结构 — 简单的选择 – 材质开启GPU Instancing选项 – 位置移动和碰撞检测在C# ...
模块::实例化 Mixin将实例记帐功能添加到类。 实例化可以迭代特定类的实例,在复杂的层次结构的情况下... 使用Instancing不要重复自己。 需要重构。试用npm installnode sample/Base.s添加npm add 'winstancing@alpha'
GPU Instancer
GPU Instancer provides user friendly tools to allow everyone to use Indirect GPU Instancing without having to go through the deep learning curve of Compute Shaders and GPU infrastructure. Also, an API...
一键将角色的Animator或Animation去掉,将SkinnedMeshRender更换为一般的Mesh Render,完成将动画效果的实现从CPU转移到GPU运算的目的,来利用GPU Instancing技术减少Draw Call。 • Convert assets quickly and ...
CA uses the GPU Instancer core and adds GPU skinning techniques on top of GPUI’s indirect instancing solution and GPU culling techniques. This results in a combination which will allow you to get ...
1.Render a boatload of spheres 2.Add Support for GPU instancing 3.Uset Material property blocks 4.Make instancing work with LOD groups