在DirectX12中使用Instancing

在DirectX12中使用Instancing

当我们需要绘制大量同一种几何物体时,可以使用instancing,一次将所需要的绘制信息全部传输给GPU,使其可以批量绘制同一种几何物体,提高绘制的效率。要使用instancing,首先要对shader代码进行调整:

struct InstanceData
{
	float4x4 world;
	float4x4 invWorld;
	float4x4 worldViewProj;
	uint materialIndex;
	uint objPad0;
	uint objPad1;
	uint objPad2;
};
    
StructuredBuffer<InstanceData> gInstanceData : register(t0, space1);

gInstanceData是一个StructuredBuffer,相当于我们把用到的object const buffer组合在一起,而在绘制过程具体的索引index则可以利用shader提供的SV_InstanceID关键字取得。还有一点,我们在vertex shader阶段取得的materialIndex,它对每个绘制的instance来说是个常量,因此是不希望经过插值阶段再传给pixel shader的,这里也可以利用shader提供的nointerpolation关键字进行处理:

struct VertexOut
{
	float4 PosH    : SV_POSITION;
	float3 PosW    : POSITION;
	float3 NormalW : NORMAL;
    float4 Color   : COLOR;
	float2 UV	   : TEXCOORD0;

	// nointerpolation is used so the index is not interpolated 
	// across the triangle.
	nointerpolation uint MatIndex  : MATINDEX;
};
    
VertexOut VS(VertexIn vin, uint instanceID : SV_InstanceID)
{
    ...
}

在CPU层我们需要调整一下根签名的创建,同时在绘制同一种几何物体的代码前设置正确的srv:

rootParams[1].InitAsShaderResourceView(0, 1);
...
mCommandList->SetGraphicsRootShaderResourceView(1, res.mObjectConstBuffer->GetGPUVirtualAddress());
  

最后,进行绘制:

mCommandList->DrawIndexedInstanced(object->mIndexCount, object->mInstanceCount, object->mStartIndexLocation, object->mBaseVertexLocation, 0);

如果你觉得我的文章有帮助,欢迎关注我的微信公众号(大龄社畜的游戏开发之路

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Instancing(实例化)批量绘制技术是一种在计算机图形学常用的技术,可以大幅提高绘制物体的效率。该技术的基本思路是在绘制时,只需要绘制一次模型,然后通过复制该模型的实例来批量绘制多个模型,从而避免了重复绘制相同模型的开销。下面是Instancing批量绘制技术使用方法: 1. 首先,需要创建一个模型实例列表,用来存储需要绘制的模型实例。每个模型实例包含一个模型的位置、旋转、缩放等信息。 2. 然后,需要创建一个缓冲区对象(Buffer Object),用来保存模型实例数据。这个缓冲区对象可以使用OpenGL或DirectX等图形API提供的Buffer Object API来创建。 3. 接着,需要将模型实例数据上传到缓冲区对象。上传数据的方式可以使用OpenGL或DirectX等图形API提供的Buffer Object API的glBufferData或ID3D11Buffer::Map等函数。 4. 在绘制时,需要使用Instancing批量绘制技术来绘制多个模型实例。具体来说,可以使用OpenGL或DirectX等图形API提供的DrawArraysInstanced或DrawIndexedInstanced等函数来绘制多个实例。 5. 最后,需要在着色器使用每个实例的位置、旋转、缩放等信息来绘制对应的模型。具体来说,可以在顶点着色器使用gl_InstanceID来获取当前实例的ID,然后根据这个ID来获取对应实例的位置、旋转、缩放等信息,从而绘制出对应的模型。 需要注意的是,使用Instancing批量绘制技术时,需要保证每个模型实例的数据在缓冲区对象是连续存储的,以便能够使用gl_InstanceID来获取对应实例的信息。此外,还需要根据硬件性能和绘制场景的复杂度来合理设置实例数量,以避免出现性能瓶颈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值