[英]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.