其他分享
首页 > 其他分享> > D3D12几何体绘制流程

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