四、D3D12学习笔记——顶点数据vertex的“说明书”

在上一篇《顶点&索引数据传入GPU》中我们给出了顶点数据的布局:

td::vector<D3D12_INPUT_ELEMENT_DESC> mInputLayout;

mInputLayout =
    {
        //语义,语义索引,格式,槽,偏移值,数据类型,是否实例化
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
    };

这就好像一份说明书,定义了原材料的名称(语义),格式,存放位置,使用方式等,方便我们把数据运送到GPU流水线上进行对号入座:

我们在CPU端编程的时候,将顶点数据存入结构体,然后还要准备这个数据的说明书:顶点布局。它的基本结构如下,通过记录布局数组首地址和长度来定义:

typedef struct D3D12_INPUT_LAYOUT_DESC
    {
    D3D12_INPUT_ELEMENT_DESC *pInputElementDescs;
    UINT NumElements;
    }     D3D12_INPUT_LAYOUT_DESC;

 这里边放对顶点数据的结构描述D3D12_INPUT_ELEMENT_DESC *pInputElementDescs数组;以及顶点数据可分解为多少个描述。D3D12_INPUT_ELEMENT_DESC 也就是说可拆解为坐标,颜色,法线等单独描述的独立语义,用法如下。

mInputLayout =
    {
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
    };
opaquePsoDesc.InputLayout = { mInputLayout.data(), (UINT)mInputLayout.size() };

比如这里,具有POSITION和COLOR两个数据,最终是传递给PSO的描述结构,用于创建PSO:

ThrowIfFailed(md3dDevice->CreateGraphicsPipelineState(&opaquePsoDesc, IID_PPV_ARGS(&mPSOs["opaque"])));

这就相当于我们把说明书给流水线了,以后流水线中的要利用我们的顶点数据的时候就会自动去看说明书,比如顶点着色器,它的输入里边就有POSITION,其实就是建立了同语义的这样一种映射,GUP就会把顶点数据填入输入参数。

注意事项和总结:

1.要保证数据传输的正确,是基于“语义”的;无论是从CPU到流水线,还是流水线内部;

2.带有SV_标记的语义意思是系统值,我接触过的有SV_POSITION和SV_TARGET,一个是表示传递给剪裁进行透视除法的坐标位置,一个是像素着色的标记,注意SV_POSITION可以出现在顶点着色器或者几何着色器,如果有几何着色器,顶点就不处理。

3.虽然COLOR这类看起来是有含义的,但是其实是种数据结构,也就是说只要数据的结构能对上,语义可以混用(SV_不行)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用DirectX 12实现图片渲染纹理数据的示例代码: ```cpp // 初始化纹理资源 ID3D12Resource* textureResource = nullptr; D3D12_RESOURCE_DESC textureDesc = {}; textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; textureDesc.Width = textureWidth; textureDesc.Height = textureHeight; textureDesc.DepthOrArraySize = 1; textureDesc.MipLevels = 1; textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; textureDesc.SampleDesc.Count = 1; textureDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; ThrowIfFailed(device->CreateCommittedResource( &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), D3D12_HEAP_FLAG_NONE, &textureDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&textureResource))); // 创建上传堆 ID3D12Resource* textureUploadHeap = nullptr; ThrowIfFailed(device->CreateCommittedResource( &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(GetRequiredIntermediateSize(textureResource, 0, 1)), D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&textureUploadHeap))); // 将纹理数据复制到上传堆 D3D12_SUBRESOURCE_DATA textureData = {}; textureData.pData = imageData; // 图像数据指针 textureData.RowPitch = textureWidth * 4; // 每行字节数 textureData.SlicePitch = textureData.RowPitch * textureHeight; UpdateSubresources(commandList, textureResource, textureUploadHeap, 0, 0, 1, &textureData); // 将纹理资源从复制目标状态转换为常量状态 CD3DX12_RESOURCE_BARRIER textureBarrier = CD3DX12_RESOURCE_BARRIER::Transition( textureResource, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); commandList->ResourceBarrier(1, &textureBarrier); // 创建纹理描述符堆 CD3DX12_DESCRIPTOR_HEAP_DESC textureHeapDesc(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 1, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE); ID3D12DescriptorHeap* textureDescriptorHeap = nullptr; ThrowIfFailed(device->CreateDescriptorHeap(&textureHeapDesc, IID_PPV_ARGS(&textureDescriptorHeap))); // 创建纹理资源视图 D3D12_SHADER_RESOURCE_VIEW_DESC textureViewDesc = {}; textureViewDesc.Format = textureDesc.Format; textureViewDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; textureViewDesc.Texture2D.MipLevels = 1; device->CreateShaderResourceView(textureResource, &textureViewDesc, textureDescriptorHeap->GetCPUDescriptorHandleForHeapStart()); ``` 这个示例代码包括以下步骤: 1. 创建纹理资源,使用R8G8B8A8_UNORM格式存储像素数据。 2. 创建上传堆,将像素数据复制到上传堆中。 3. 使用`UpdateSubresources`函数将上传堆中的数据复制到纹理资源中。 4. 使用`CD3DX12_RESOURCE_BARRIER`将纹理资源从复制目标状态转换为常量状态。 5. 创建纹理描述符堆和纹理资源视图,使其在着色器中可见。 请注意,这只是一个示例代码,并且需要根据您的具体需要进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值