【问题标题】:Assign struct C++ with HLSL variable使用 HLSL 变量分配结构 C++
【发布时间】:2016-04-10 13:22:41
【问题描述】:

我才开始使用 DirectX,所以我遇到了这个问题:

我正在尝试将 c++ 结构推入/发送/分配到/进入/带有 HLSL 变量,该变量与来自 C++ 的结构具有相同的数据类型。

在 C++ 中:

struct Light 
{
    Light() {
        ZeroMemory(this, sizeof(Light));
    }
    D3DXVECTOR3 LightPos;
    float ID;
};
Light L1;

/.../

ID3D10EffectVariable* L1Var = NULL;

/.../

L1Var = Effect->GetVariableByName("L1")->AsVector();

/.../


L1Var->SetRawValue(&L1, 0, sizeof(Light));

HLSL 代码:

struct Light {
    float3 LightPos;
    float ID;
};

Light L1;

我正在尝试将结构从 C++ 发送到 HLSL 中的“L1”,但我不确定 HLSL 中 L1 类型的正确性。 此代码正在运行,但我在 L1 中的整个参数也得到了 0...我不知道如何解决这个问题,我用谷歌搜索了 5 个小时没有结果...请帮助。

感谢您的帮助。

【问题讨论】:

    标签: c++ struct hlsl assign directx-10


    【解决方案1】:

    首先,如果您是 DirectX 编程新手,我建议不要投资 DirectX 10。您应该使用 DirectX 11,因为它得到更好的支持,具有更多相关的实用程序代码,并且是在支持 DirectX 10 的每个平台上都受支持。此外,您使用的是旧版 D3DX 数学,因此您绝对应该转向更现代的开发环境。今天使用旧版 DirectX SDK 的理由很少。请参阅this blog postMSDN 了解此处的背景信息。你会发现DirectX Tool Kittutorials 是一个很好的起点。如果你真的想坚持使用效果系统,请参阅Effects 11

    请记住,HLSL 常量缓冲区使用打包和对齐的方式与标准 C/C++ 结构略有不同。如果您尽可能坚持使用 4 向量结构而不是使用 3 向量版本,您将获得更直观的行为。从理论上讲,您的 C/C++ 和 HLSL 结构是将数据打包成单个 4 向量的“匹配”,但各种编译器设置和打包规则可能会将其丢弃。见Packing Rules for Constant Variables。一个很好的验证方法是使用static_assert

    static_assert(sizeof(L1) == 16, "CB/struct mismatch");
    

    问题很可能是您对效果系统的使用。由于查找失败,L1Var 可能是一个虚拟变量,因此您的 SetRawValue 不会做任何事情。从您提供的 HLSL 的 sn-p 来看,我不清楚您的 L1 HLSL 变量甚至是一个常量缓冲区。尝试一些调试代码:

    auto tempVar = Effect->GetVariableByName("L1");
    if ( tempVar->IsValid() )
    {
        D3DX10_EFFECT_VARIABLE_DESC desc={0};
        tempVar->GetDesc(desc);
        OutputDebugStringA(desc.Name); // Set a breakpoint here and look at desc
        OutputDebugStringA("\n");
    }
    else
    {
        OutputDebugStringA("L1 is not valid!\n");
    }
    

    【讨论】:

    • 非常感谢您的回答。还想帮忙做一件事吗? :可以帮助我将 float3 的二维数组从 c++ 传递到 hlsl 吗?
    • 您不能将任意长度的数据块传递给着色器。您必须选择最大尺寸并始终发送那么多。有关示例,请参见 SkinnedEffect 的着色器(参见 Bones 数组)。确保您的目标 Direct3D hardware feature level 支持您的整体恒定缓冲区大小。
    猜你喜欢
    • 2014-08-20
    • 2013-03-30
    • 2021-03-19
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2021-07-06
    相关资源
    最近更新 更多