有沒有什麼辦法在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. 使用HLSL設置TextureAddressMode
- 2. 正常化HLSL中的矢量錯誤
- 3. 設置控制常規的方法值
- 4. c#:將非常量值設置爲屬性的解決方法?
- 5. 在python包中設置類和常量的正確方法
- 6. 如何設置方法所需的常量?
- 7. 如何使用SlimDX設置HLSL均勻變量的值?
- 8. 如何在常量方法上設置EXPECT_CALL?
- 9. OOP設置方法不正常
- 10. HLSL中的方法如何交叉?
- 11. Grails-斯波克:打開設置方法,常用的方法
- 12. 用gradle設置常量值
- 13. 會話變量設置 - Page_Load方法C#
- 14. 方法設置
- 15. 從變量值設置常量
- 16. Angularjs變量設置方法不改變外部變量的方法
- 17. 爲什麼常量的值會影響HLSL着色器編譯?
- 18. 根據環境設置配置常量
- 19. hlsl矩陣乘法
- 20. 將JTabbedPane的寬度設置爲常量
- 21. VHDL設置RAM中的常量數據
- 22. 設置JScrollPane的常量大小
- 23. 代碼部分的Inno設置常量
- 24. Laravel 4 Packages(config.php)中的常量設置
- 25. XNA SpriteBatch.Draw 3D矢量HLSL
- 26. C++ HLSL緩衝區變量
- 27. HLSL:預定義變量
- 28. 在C++ TDD中調用重載常量與非常量方法的好方法?
- 29. 導入單個Django設置常量以避免完整設置導入開銷的正確方法?
- 30. Java的設置方法
與OpenGL相比看起來很不舒服=/ 無論如何 - 感謝您的回覆。 – mjollneer 2013-02-27 06:17:37
你認爲你可以將我的回答標記爲答案嗎? :) – alanw 2013-02-28 05:26:57
好的。但實際上這不是答案。你更可能指出問題的不妥當性。這不是我要求的,但需要什麼=) – mjollneer 2013-02-28 10:04:05