Directx11中获取HLSL中变量一些问题

本文介绍了在DirectX11中如何将StructuredBuffer与HLSL变量对应,探讨了当结构体类型不同时可能出现的问题,并强调不能同时通过ShaderResourceView读取和UnorderedAccessView写入同一个资源。示例代码展示了正确和错误的使用方式。
摘要由CSDN通过智能技术生成

    在Directx11中,针对如何在Directx11中获取HLSL变量(主要以structured为例)并对其读写的问题,这两天做了几个小小实验。整理下思路如下。

    一般用CSSetShaderResources()来将Directx的resource(主要以structure buffer为例,所以下面有时会说resource,有时会说structured buffer)和HLSL中相应的structured buffer对应起来。

    如果在HLSL中的structured有指定register(比如StructuredBuffer<TestBufType> testInBuffer:register(t0)),那么就根据CSSetShaderResources(UINT startSlotUINT numViews,ID3D11ShaderResoucesView** srvViews)  来将Directx中resource(structured buffer)对应到HLSL中相应的register(tstartSlot)。比如如果startSlot==0,那么就将srvViews指向的第一个structured buffer绑定到register(t0),同理startSlot==1,就绑定register(t1)

如果没有指定register,但structure类型相同,那么应该可以按照从上到下的顺序来排列。但是如果structure的类型不同,那么可能会出现一些问题,详见下面示例。

对于CSSetUnorderedAccessViews(),因为只能有一个register(u0),感觉是根据structure的类型自动匹配。


UnorderedAccessViews只能有一个registerregister(u0)。我曾经设置多个register(ui)的时候编译报错如下:

{

error X4509: maximum UAV register index exceeded, target has 1 slots, manual bind to 

slot u1 failed.the following operation failed:CompileComputeShader( L"HandsOnLab_SimpleCS.hlsl", "SimpleCS" )

请按任意键继续. . .

}

但后来看到一些techPaper说UnorderedAccessViews可以有多个register,但是上面的编译错误怎么解释?只能以后再查资料看看。

 

不能对同一个resource同一时刻(注意同一时刻的概念,可以都创建,但不能同一时刻通过两种viewsaccess resourceShaderResourceView和用UnorderedAccessViews,只需要用UnorderedAccessViews读写即可。

比如对于以下HLSL程序,如果HLSLtestInBuffertestBuffer变量都是绑定自Directx中同一个StructuredBuffer(其类型为struct Type{XMLFLOAT2;XMLFLOAT2;};)假设其全部数值为2.0f)的ShaderResourceViewUnorderedAccessView,那么程序执行的结果貌似是testInBuffer即通过shaderResourceViewaccess会失败,导致其传入的数值全部为0。

//==================================================

struct TestBufType

{

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值