2

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

4

3 回答 3

1

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

float4 sample_constant : register(c12);

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

于 2013-02-27T03:02:53.743 回答
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或其变体之一编译着色器代码时获取此对象。

于 2014-08-05T14:22:40.627 回答
0

随着 D3DX 的弃用,我觉得很多人可以找到这个主题来寻找相同问题的解决方案,就像我一样。

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

我找到了一个主题来讨论这个问题并提出了实现这个的工作代码,它完美地工作。我不想功劳,而是链接原作者,因此为“只是”在 GameDev.net 上发布该主题的链接表示歉意:

http://www.gamedev.net/topic/648016-replacement-for-id3dxconstanttable/#entry5095598

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

于 2016-07-31T01:27:08.353 回答