簡體   English   中英

用HLSL變量分配結構C ++

[英]Assign struct C++ with HLSL variable

我只開始使用DirectX,所以遇到了這個問題:

我正在嘗試將HLSL變量推入/發送/分配給/與CSL結構具有相同數據類型的HLSL變量。

在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。我不知道如何解決這個問題,我用google搜索了5個小時,沒有任何結果。

謝謝你的幫助。

首先,如果您不熟悉DirectX編程,建議您不要投資DirectX10。您應該使用DirectX 11,因為它受到更好的支持,具有更多相關的實用程序代碼,並且在支持DirectX 10的每個平台上都受支持。 ,您使用的是舊版D3DX數學,因此,您肯定應該再次轉到更現代的開發環境。 今天幾乎沒有理由使用舊版DirectX SDK。 請參閱此博客文章MSDN以獲取背景信息。 您會發現DirectX Tool Kit及其教程是一個很好的起點。 如果您真的想使用效果系統,請參見效果11

請記住,HLSL常量緩沖區以與標准C / C ++結構稍有不同的方式使用打包和對齊。 如果在可能的情況下堅持使用4矢量結構而不是使用3矢量版本,則會獲得更直觀的行為。 從理論上講,您的C / C ++和HLSL結構是“匹配”,將數據打包到單個4向量中,但是各種編譯器設置和打包規則可能會使這種情況不成立。 請參閱常量變量的打包規則 驗證的一個好方法是使用static_assert

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

問題很可能是您對效果系統的使用。 由於查找失敗, 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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM