При использовании:
VS_OUTPUT VS(float4 pos : POSITION, float4 color : COLOR) : VS_OUTPUT_SEMANTICS
VS_OUTPUT_SEMANTICS будет фактически переопределять семантику для каждого элемента, поэтому вместо вывода структуры, такой как:
struct VS_OUTPUT
{
float4 pos : SV_POSITION;
float4 color : COLOR0;
};
, вы фактически выводите
struct VS_OUTPUT
{
float4 pos : VS_OUTPUT_SEMANTICS;
float4 color : VS_OUTPUT_SEMANTICS;
};
Когда вы вызываете:
UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_SKIP_OPTIMIZATION | D3DCOMPILE_DEBUG;
r = D3DCompileFromFile(L"shader.fx", NULL, NULL, "VS", "vs_5_0", flags, 0, &vertex_blob, &errMsg);
Даже если шейдер компилируется, вы все равно должны смотреть в errMsg, так как компилятор может выдавать некоторые предупреждения (которые в этом случае будут):
"semantics in type overriden by variable/function or enclosing type"
Если также может быть хорошей идеей вызвать D3DDisassemble для полученного большого двоичного объекта, это может дать вам полученные данные отражения в текстовой форме.
В вашем случае вершинного шейдера вы будет иметь (только соответствующая часть):
// Input signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// POSITION 0 xyzw 0 NONE float xyzw
// COLOR 0 xyzw 1 NONE float xyzw
//
//
// Output signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// VS_OUTPUT_SEMANTICS 0 xyzw 0 NONE float xyzw
// VS_OUTPUT_SEMANTICS 1 xyzw 1 NONE float xyzw
//