有没有办法在opengl风格的c ++代码中设置HLSL(例如)顶点着色器常量?
我的意思是 - 没有d3dx,没有常数表。 Shader已经使用fxc.exe编译并设置。只有LPDIRECT3DVERTEXSHADER9和LPDIRECT3DDEVICE9。我打算使用SetVertexShaderConstant
*,但发现无法将常量名称(例如“u_mvpMatrix”)转换为“将包含第一个常量值的寄存器号码。”。
答案 0 :(得分:1)
您需要将常量绑定到着色器文件中的寄存器。例如
float4 sample_constant : register(c12);
这会将sample_constant绑定到寄存器12.然后,您可以使用SetVertexShaderConstant()为寄存器设置12的常量。
答案 1 :(得分:0)
您可以使用ID3DXConstantTable API按名称设置常量。例如,如果在着色器中有一个名为float4
的{{1}}常量,则可以像这样在C / C ++中设置它:
cameraPos
在此示例中,float val[4] = {0,1,0,1};
D3DXHANDLE camposHandle = consttab->GetConstantByName(NULL, "cameraPos");
consttab->SetFloatArray(d3ddev, camposHandle, val, 4);
是设备对象,consttab是d3ddev
对象。使用D3DXCompileShaderFromFile或其中一个变体编译着色器代码时,可以获取此对象。
答案 2 :(得分:0)
随着D3DX的弃用,我觉得很多人都可以找到这个主题来寻找同一问题的解决方案,就像我一样。
确实有一种方法可以通过解析实际编译的着色器代码将常量名称转换为寄存器编号。
我发现了一个主题正在讨论这个问题并提出实现这一点的工作代码,并且它可以完美地运行。我不想信用,但链接原作者,所以道歉"只是"在GameDev.net上发布主题链接:
http://www.gamedev.net/topic/648016-replacement-for-id3dxconstanttable/#entry5095598
这个解决方案正是OP要求的,而不是"解决方法"。