Direct3D 12 中使用 Stream Output 的细节研究

Direct3D 12 Stream Output 使用的坑与解决
本文详细探讨了Direct3D 12中Stream Output(SO)的使用,特别关注了BufferFilledSize和T-Buffer的问题。在BufferFilledSize部分,介绍了其创建、使用和对GPU指示数据位置的重要性。在T-Buffer部分,分析了导致模型消失的原因,指出NumElements参数理解错误是关键。通过深入研究和调试,揭示了解决这些问题的关键所在。

目录

一、前言:

二、坑1: BufferFilledSize

1.BufferFilledSize 的创建

2.BufferFilledSize 的使用

3.总结 BufferFilledSize

三、坑2:T-Buffer 和 NumElements

1.T-Buffer 问题的表象

2.T-Buffer 问题的分析

3.T-Buffer 问题的原因

四、尾声


一、前言:

        一直在做骨骼动画,其中 Skinning 的部分使用 D3D12 的 Stream Output,经过一段“苦难”的探索终于成功了,其中遇到了一些坑,这些坑看似很小很不起眼,但是各个致命,没搞明白就无法运行或出错,在此和大家分享一下。

注:以下 Stream Output 简称为 SO。

二、坑1: BufferFilledSize

        关于什么是 BufferFilledSize 请具体参看 MSDN 上相关的文档说明。简单的描述一下就是这是用来告诉 GPU 当前 SO 到哪里。

1.BufferFilledSize 的创建

(1) BufferFilledSize 的大小要求是 8 个字节(unsigned long long) 。

(2) 它可以创建在任何 Heap 是 Default 的 Buffer 中,Upload/Readback Heap 是不可以的。也就是说它既可以创建在 Output 的 Buffer 中也可以专门为它单开一个 Buffer。

(3) 一个 Mesh 中需要经过 SO 操作的每一个流都需要一个 BufferFilledSize 。比如说如果有 Position/Normal/Binormal/Tanget 这 4 个流需要 SO ,那么就需要准备 4 个 BufferFilledSize ,一共需要 8

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值