小编Ben*_*Goh的帖子

在常量缓冲区中打包 HLSL 浮点数组?

人们。

我在通过constant buffer浮点数组传递给顶点着色器(HLSL)时遇到问题。我知道由于 HLSL 打包规则,下面数组中的每个“浮点数”都单独获得一个 16 字节的插槽(空间相当于 float4):

// C++ struct
struct ForegroundConstants
{
    DirectX::XMMATRIX transform;
    float bounceCpp[64];
};


// Vertex shader constant buffer
cbuffer ForegroundConstantBuffer : register(b0)
{
    matrix transform;
    float bounceHlsl[64];
};
Run Code Online (Sandbox Code Playgroud)

(不幸的是,这里的简单解决方案不起作用,在我进行更改后没有绘制任何内容)

而C ++数据被传递时,由于包装规则他们得到间隔开,使得每个“浮动”中bounceCpp C ++阵列中进入一个16字节的空间中的所有本身bounceHlsl阵列。这导致了类似于以下内容的警告:

ID3D11DeviceContext::DrawIndexed:Vertex Shader 单元的 slot 0 处的 Constant Buffer 的大小太小(提供 320 字节,至少 1088 字节,预期)。这是可以的,因为越界读取被定义为返回 0。开发人员也可能知道无论如何都不会使用丢失的数据。如果开发人员实际上打算为着色器期望绑定足够大的常量缓冲区,这只是一个问题。

正如此处此处所指出的,建议以这种方式重写 HLSL 常量缓冲区:

cbuffer ForegroundConstantBuffer : register(b0)
{
    matrix transform;
    float4 bounceHlsl[16]; // equivalent …
Run Code Online (Sandbox Code Playgroud)

directx hlsl directx-11 vertex-shader

5
推荐指数
1
解决办法
1万
查看次数

上下文"use_current"的任务继续不起作用

三天前我试过寻找答案.要么我做了一些从根本上说错误的事情(这是一个明显的错误),要么事情太新了,没有任何参考,我似乎无法理解为什么像这样的简单案例会失败.

下面的代码在Windows应用商店应用程序中使用C++中的PPL任务库,模拟在打开循环之前需要2秒的文件加载操作(当然这是为了说明最小代码的问题,真正的循环执行其他渲染到也表明进步).

如果我使用"use_current"作为延续上下文,则永远不会调用代码的延续部分(即"fileLoaded = true"):

bool fileLoaded = false;
while (!fileLoaded)
{
    concurrency::task<void>([this]()
    {
        // Simulate file load delay
        concurrency::wait(2000);

    }).then([this, &fileLoaded]()
    {
        fileLoaded = true; // This never gets executed!

        // If the following is changed to "use_default" or 
        // "use_arbitrary", then this continuation gets called.
    }, concurrency::task_continuation_context::use_current());

    concurrency::wait(50);
}
Run Code Online (Sandbox Code Playgroud)

如果我使用"use_default"或"use_arbitrary",并将"fileLoad"正确设置为"true",则相同的代码可以正常工作.这段代码可以放在Windows Store C++应用程序的任何地方(例如Direct2D应用程序),它会失败(我把它放在"DirectXPage :: DirectXPage"构造函数体中,我希望它是主要的UI线程).我做了一件可怕的错事吗?

在此先感谢您的帮助!:)

c++ visual-c++ windows-8 windows-runtime ppl

1
推荐指数
1
解决办法
2674
查看次数