Directx 设置HLSL常数的方法 有没有办法在OpenGL风格中从C++代码中设置HLSL(例如)顶点着色器常数? 我的意思是-没有d3dx,没有常数表。着色器已使用fxc.exe编译并设置。只有LPDIRECT3DVERTEXSHADER9和LPDIRECT3DDEVICE9。我计划使用SetVertexShaderConstant*,但没有办法将常量名称(例如“u_MVP矩阵”)转换为“将包含第一个常量值的寄存器号”。

Directx 设置HLSL常数的方法 有没有办法在OpenGL风格中从C++代码中设置HLSL(例如)顶点着色器常数? 我的意思是-没有d3dx,没有常数表。着色器已使用fxc.exe编译并设置。只有LPDIRECT3DVERTEXSHADER9和LPDIRECT3DDEVICE9。我计划使用SetVertexShaderConstant*,但没有办法将常量名称(例如“u_MVP矩阵”)转换为“将包含第一个常量值的寄存器号”。,directx,constants,shader,vertex-shader,Directx,Constants,Shader,Vertex Shader,您需要将常量绑定到着色器文件中的寄存器。例如 float4 sample_constant : register(c12); 这将sample_常量绑定到寄存器12。然后,您可以使用SetVertexShaderConstant()为寄存器设置使用12的常量。您可以使用API按名称设置常量。例如,如果着色器中有一个名为cameraPos的float4常量,则可以从C/C++进行如下设置: float val[4] = {0,1,0,1}; D3DXHANDLE camposHandle = c

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

float4 sample_constant : register(c12);

这将sample_常量绑定到寄存器12。然后,您可以使用SetVertexShaderConstant()为寄存器设置使用12的常量。

您可以使用API按名称设置常量。例如,如果着色器中有一个名为
cameraPos
float4
常量,则可以从C/C++进行如下设置:

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

在本例中,
d3ddev
是设备对象,constab是
ID3DXConstantTable
对象。当您使用或其变体编译着色器代码时,您可以获得此对象。

随着D3DX的弃用,我觉得许多人可以在寻找相同问题的解决方案时找到此主题,就像我一样

通过解析实际编译的着色器代码,确实有一种将常量名称转换为寄存器编号的方法

我发现有一个主题正是在讨论这一点,并提出了实现这一点的工作代码,它工作得完美无缺。我不想获得荣誉,但要链接原作者,因此,对于“只是”在GameDev.net上发布主题链接表示歉意:


此解决方案正是OP所要求的,而不是“解决方法”。

与OpenGL=/相比,无论如何看起来都非常不舒服-谢谢您的回复。好的。但实际上这不是答案。更有可能是你指出了问题的不当之处。这不是我所要求的,而是需要的(=)将起作用,但关键条件是“没有d3dx,没有常量表”。