有沒有什麼辦法在opengl風格的C++代碼中設置HLSL(例如)頂點着色器常量? 我的意思是 - 沒有d3dx,沒有常量表。着色器已經使用fxc.exe和set進行編譯。只有LPDIRECT3DVERTEXSHADER9和LPDIRECT3DDEVICE9。我計劃使用SetVertexShaderConstant
*,但沒有辦法將常量名稱(例如「u_mvpMatrix」)轉換爲「將包含第一個常量值的寄存器編號」。設置HLSL常量的方法
回答
您需要將常量綁定到着色器文件中的寄存器。例如。
float4 sample_constant : register(c12);
此結合sample_constant註冊12.然後可以使用的SetVertexShaderConstant()使用12爲寄存器中設定的常數。
您可以使用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或其中一個變體編譯着色器代碼時,可以獲得此對象。
這將起作用,但關鍵條件是「沒有d3dx,沒有常量表」。 – mjollneer 2014-08-06 11:41:09
隨着D3DX的棄用,我覺得很多人會發現在尋找解決同一問題的這個話題,因爲沒有一
確實是有一種方式來翻譯常量名註冊號,通過解析實際編譯的着色器代碼。
我發現了一個話題,討論這個和positing工作代碼,實現這一點,它的工作完美無瑕。我不想邀功,但鏈接原作者,所以道歉的「公正」張貼在GameDev.net的鏈接話題:
http://www.gamedev.net/topic/648016-replacement-for-id3dxconstanttable/#entry5095598
該解決方案是完全OP問什麼因爲,而不是「解決方法」。
- 1. 設置控制常規的方法值
- 2. OOP設置方法不正常
- 3. Grails-斯波克:打開設置方法,常用的方法
- 4. 用gradle設置常量值
- 5. 從變量值設置常量
- 6. Angularjs變量設置方法不改變外部變量的方法
- 7. 根據環境設置配置常量
- 8. HLSL:預定義變量
- 9. VHDL設置RAM中的常量數據
- 10. Laravel 4 Packages(config.php)中的常量設置
- 11. 在C++ TDD中調用重載常量與非常量方法的好方法?
- 12. 導入單個Django設置常量以避免完整設置導入開銷的正確方法?
- 13. HLSL固定照明位置
- 14. Java類中方法的靜態最終常量的位置
- 15. Java的設置方法
- 16. 的Javascript設置方法
- 17. 非常快速的方法來檢查C中的設置位
- 18. Mockito無法在方法中拋出異常時設置
- 19. HLSL:在編譯時強制執行常量寄存器限制
- 20. HLSL常量緩衝區包裝意外錯誤
- 21. 注意:使用未定義的常量方法 - 假設
- 22. Ruby常量有一種方法可以有真正的常量..?
- 23. 的QImage和常量位()const的方法
- 24. 如何根據用戶設置的初始變量設置一組常量值
- 25. 全局變量未設置值正常
- 26. 搖籃/常規設置環境變量
- 27. 如何在express js中設置常量?
- 28. 在PHP中設置Memcached常量
- 29. 爲背景設置常量半透明
- 30. DirectX11設置着色器常量
與OpenGL相比看起來很不舒服=/ 無論如何 - 感謝您的回覆。 – mjollneer 2013-02-27 06:17:37
你認爲你可以將我的回答標記爲答案嗎? :) – alanw 2013-02-28 05:26:57
好的。但實際上這不是答案。你更可能指出問題的不妥當性。這不是我要求的,但需要什麼=) – mjollneer 2013-02-28 10:04:05