2013-02-26 97 views
1

有沒有什麼辦法在opengl風格的C++代碼中設置HLSL(例如)頂點着色器常量? 我的意思是 - 沒有d3dx,沒有常量表。着色器已經使用fxc.exe和set進行編譯。只有LPDIRECT3DVERTEXSHADER9和LPDIRECT3DDEVICE9。我計劃使用SetVertexShaderConstant *,但沒有辦法將常量名稱(例如「u_mvpMatrix」)轉換爲「將包含第一個常量值的寄存器編號」。設置HLSL常量的方法

回答

1

您需要將常量綁定到着色器文件中的寄存器。例如。

float4 sample_constant : register(c12); 

此結合sample_constant註冊12.然後可以使用的SetVertexShaderConstant()使用12爲寄存器中設定的常數。

+0

與OpenGL相比看起來很不舒服=/ 無論如何 - 感謝您的回覆。 – mjollneer 2013-02-27 06:17:37

+0

你認爲你可以將我的回答標記爲答案嗎? :) – alanw 2013-02-28 05:26:57

+0

好的。但實際上這不是答案。你更可能指出問題的不妥當性。這不是我要求的,但需要什麼=) – mjollneer 2013-02-28 10:04:05

0

您可以使用ID3DXConstantTable API按名稱設置常量。例如,如果你有一個float4恆定稱爲cameraPos在你着色器可以從C/C++設置它像這樣:

float val[4] = {0,1,0,1}; 
D3DXHANDLE camposHandle = consttab->GetConstantByName(NULL, "cameraPos"); 
consttab->SetFloatArray(d3ddev, camposHandle, val, 4); 

在這個例子中,是d3ddev設備對象和consttab是ID3DXConstantTable對象。當您使用D3DXCompileShaderFromFile或其中一個變體編譯着色器代碼時,可以獲得此對象。

+0

這將起作用,但關鍵條件是「沒有d3dx,沒有常量表」。 – mjollneer 2014-08-06 11:41:09

0

隨着D3DX的棄用,我覺得很多人會發現在尋找解決同一問題的這個話題,因爲沒有一

確實是有一種方式來翻譯常量名註冊號,通過解析實際編譯的着色器代碼。

我發現了一個話題,討論這個和positing工作代碼,實現這一點,它的工作完美無瑕。我不想邀功,但鏈接原作者,所以道歉的「公正」張貼在GameDev.net的鏈接話題:

http://www.gamedev.net/topic/648016-replacement-for-id3dxconstanttable/#entry5095598

該解決方案是完全OP問什麼因爲,而不是「解決方法」。