有没有办法从opengl风格的c ++代码中设置HLSL(例如)顶点着色器常量?我的意思是 - 没有 d3dx,没有常量表。着色器已使用 fxc.exe 编译并设置。只有 LPDIRECT3DVERTEXSHADER9 和 LPDIRECT3DDEVICE9。我计划使用SetVertexShaderConstant
*,但找不到将常量名称(例如“u_mvpMatrix”)转换为“将包含第一个常量值的寄存器号”的方法。
3 回答
您需要将常量绑定到着色器文件中的寄存器。例如。
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 的弃用,我觉得很多人可以找到这个主题来寻找相同问题的解决方案,就像我一样。
通过解析实际编译的着色器代码,确实有一种方法可以将常量名称转换为寄存器编号。
我找到了一个主题来讨论这个问题并提出了实现这个的工作代码,它完美地工作。我不想功劳,而是链接原作者,因此为“只是”在 GameDev.net 上发布该主题的链接表示歉意:
http://www.gamedev.net/topic/648016-replacement-for-id3dxconstanttable/#entry5095598
该解决方案正是 OP 所要求的,而不是“解决方法”。