C++ 分配结构C++;使用HLSL变量

C++ 分配结构C++;使用HLSL变量,c++,struct,hlsl,assign,directx-10,C++,Struct,Hlsl,Assign,Directx 10,我刚开始使用DirectX,所以我遇到了这个问题: 我试图将C/C++结构推送到/HLLSL变量中,它与C++中的结构相同。 在C++中: struct Light { Light() { ZeroMemory(this, sizeof(Light)); } D3DXVECTOR3 LightPos; float ID; }; Light L1; /.../ ID3D10EffectVariable* L1Var = NULL; /.../

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

我试图将C/C++结构推送到/HLLSL变量中,它与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”,但是我不确定L1类型在HLSL中是否正确。 这段代码是有效的,但我也得到了一个0为整个参数在L1。。。我不知道如何解决这个问题,我在谷歌上搜索了5个小时没有结果。。。请帮忙


感谢您的帮助。

首先,如果您是DirectX编程新手,我建议您不要投资DirectX 10。您应该使用DirectX 11,因为它得到了更好的支持,有更多相关的实用程序代码,并且在每个支持DirectX 10的平台上都受支持。此外,您使用的是传统的D3DX数学,因此您肯定应该转向更现代的开发环境。现在很少有理由使用传统的DirectX SDK。有关背景信息,请参见和。你会发现,这是一个很好的起点。如果确实要坚持使用效果系统,请参见

请记住,HLSL常量缓冲区使用打包和对齐的方式与标准C/C++结构略有不同。如果在可能的情况下坚持使用4矢量结构,而不是使用3矢量版本,则可以获得更直观的行为。理论上,您的C/C++和HLSL结构是将数据打包到单个4向量中的“匹配”,但是各种编译器设置和打包规则可能会导致这种情况。看见验证这一点的一个好方法是使用
static\u assert

static_assert(sizeof(L1) == 16, "CB/struct mismatch");
问题很可能是您使用的效果系统<由于查找失败,code>L1Var可能是一个伪变量,因此您的
SetRawValue
不会执行任何操作。从您提供的HLSL片段中,我不清楚您的
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");
}

非常感谢你的回答。想再帮我一件事吗可以帮助我从FC++中把FLUAT3的2D数组传递给HLSL吗?你不能把任意长度的数据块传递给着色器。您必须选择最大尺寸,并始终发送这么多。有关示例,请参见着色器(请参见
Bones
array)。确保您的目标支持总体恒定缓冲区大小。