ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

D3D12几何体绘制流程

2020-08-31 16:34:29  阅读:334  来源: 互联网

标签:R32G32B32 FORMAT DXGI 几何体 INPUT 缓冲区 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有