D3D12几何体绘制流程
作者:互联网
一些名词:
渲染目标视图 RTV(render arget view,渲染目标视图)
顶点缓冲区视图 (vertex buffer view)
D3D12几何体绘制流程
1.设置顶点
设置顶点结构体(坐标,颜色,贴图,法线等
2.设置输入布局描述(D3D12_INPUT_LAYOUT_DESC)
定义
typedef struct D3D12_INPUT_ELEMENT_DESC
{
LPCSTR SemanticName;//语义
UINT SemanticIndex;//语义索引(顶点结构体中纹理等资源可能不止一组
//(eg:POSITION POSITION0 POSITION1
DXGI_FORMAT Format;//元素格式 (eg:DXGI_FORMAT_R32G32B32_FLOAT)
UINT InputSlot;//输入槽 索引为0-15
UINT AlignedByteOffset;//结构体偏移量,单位为字节B ,
//若结构体中有多个语义描述,gpu在读取结构体时要跳过前面的结构,
//以DXGI_FORMAT_R32G32B32_FLOAT(单位为 位b)为例需要偏移sizeof(DXGI_FORMAT_R32G32B32_FLOAT)
D3D12_INPUT_CLASSIFICATION InputSlotClass;//暂设为D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA
UINT InstanceDataStepRate;//暂设为0
}D3D12_INPUT_ELEMENT_DESC;
填充示例
D3D12_INPUT_ELEMENT_DESC desc1[] = {
{"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA,0},
{"COLOR",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,
D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA,0}
};
DXGI_FORMAT_R32G32B32_FLOAT
大小手动计算(1字节B = 8位b)
: 32*3 = 96 96 / 8 = 12
3.设置顶点缓冲区
D3D12中,大多数资源都由D3D12Resource创建详见龙书p179
填充缓冲区资源结构体 D3D12_RESOURCE_DESC
可以使用Direct3D 12
提供的C++ 包装类CD3DX12_RESOURCE_DESC
来简化描述过程
VertexBufferGPU = d3dUtil::CreateDefaultBuffer(md3dDevice.Get(), mCommandList.Get(),
vertices,vertexBufferByteSize, VertexBufferUploader
);
CreateDefaultBuffer
解析
1)创建实际的缓冲区资源
2)创建一个上传堆
3)描述缓冲区资源(指向缓冲区的指针,缓冲区大小
4)将上传堆复制到默认堆 UpdateSubresources<1>(cmdList, defaultBuffer.Get(), uploadBuffer.Get(), 0, 0, 1, &subResourceData);
5)通过CommandList::IASetVertexBuffers将索引缓冲区绑定到输入装配阶段
4.设置索引缓冲区(与顶点缓冲区类似)
最后通过 mCommandList->IASetIndexBuffer(&indexBufferView);
来设置
5.配置顶点着色器和片元着色器
略,懂的都懂 doge。
6.创建常量缓冲区
常量缓冲区大小必须为硬件最小分配空间(256B
)的整数倍
为了确保常量缓冲区大小分配正确可以使用以下方法进行计算
static UINT CalcConstantBufferByteSize(UINT byteSize)
{
return (byteSize + 255) & ~255;
}
标签:R32G32B32,FORMAT,DXGI,几何体,INPUT,缓冲区,D3D12,绘制 来源: https://www.cnblogs.com/victor2k/p/13590222.html