有没有什么办法在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