2013-02-26 55 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问什么因为,而不是“解决方法”。