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またはそのバリアントの 1 つを使用してシェーダー コードをコンパイルすると、このオブジェクトを取得できます。
D3DX の廃止により、私と同じように、多くの人が同じ問題の解決策を求めてこのトピックを見つけることができると思います。
実際にコンパイルされたシェーダー コードを解析することにより、定数名をレジスター番号に変換する方法があります。
これを正確に議論し、これを実装する作業コードを提示するトピックを見つけましたが、問題なく動作します。私はクレジットを取りたくありませんが、元の作者にリンクします.
http://www.gamedev.net/topic/648016-replacement-for-id3dxconstanttable/#entry5095598
この解決策は、「回避策」ではなく、まさに OP が求めていたものです。