DirectX 11 学习笔记-Part2-1【Instancing】

本文介绍了DirectX 11中的实例化(Instancing)技术,旨在减少draw API调用,提高渲染效率。通过硬件实例化,将多个相同几何体的数据存储在顶点缓冲区中,着色器利用实例ID处理不同实例的坐标、颜色等属性,从而绘制大量类似物体。输入布局和绘制API(DrawIndexedInstanced)也需要相应调整以支持实例化。
摘要由CSDN通过智能技术生成

Instancing

实例化(Instancing)的意思是指,在场景中多次绘制同一个物体,但是可以有不同的位置,方向,缩放,材质和贴图等。

我们在绘制相同几何体时,通常不会直接使用每个几何体的世界坐标顶点和索引来绘制,而是使用同一份顶点和索引数据,然后根据不同物体的不同世界坐标,将本地坐标变换成世界坐标再进行绘制。这种做法虽然减少了重复的存储,但每次绘制时依然需要为每个物体设置一个不同的世界坐标矩阵,独特的材质并调用一次Draw命令。而实际上,我们应当尽量减少draw API的调用,因为过多的draw call会加重cpu的负担带来额外的开销。

Direct3D提供一种机制用于绘制大量类似的几何体,这种机制被称为hardware instancing。

这种机制的核心思想是将需要绘制的实例的数据直接存放在顶点缓冲区中,并在每次绘制时使用顶点缓冲区中实例对应的数据。此时着色器代码中的输入顶点结构体可以定义为:

struct VertexIn
{
    float3 PosL : POSITION;
    float3 NormalL : NORMAL;
    float2 Tex : TEXCOORD;
    row_major float4x4 World : WORLD;
    float4 Color : COLOR;
    uint InstanceId : SV_InstanceID;
};

顶点数据可以分为两部分,前三个数据和之前的顶点数据一样,代表缓冲区中每个顶点的坐标,法线和纹理坐标。而后三个数据则是对应每个将要绘制的实例,即每个实例都有一个世界坐标,颜色和实例ID值。这里的InstanceId是系统提供的,第一个实例的id为0以此类推。使用中可以

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值