Я пытаюсь скомпилировать очень простой Effect Shader, ориентированный на DirectX9 и модель шейдера 2. Я пытаюсь передать непосредственно координаты экрана для позиций вершин вместо умножения на матрицы мира, вида и проекции, поэтому вместо этого я использую семантику POSITIONT семантики POSTION0 в структуре VertexShaderInput. Однако, когда я пытаюсь скомпилировать шейдер с помощью
fxc.exe /Od /Zi /T fx_2_0 /Fo simple.fxo simple.fx
Я получаю следующую ошибку: «ошибка X4502: неверная семантика ввода — POSITIONT0»
Кажется, по какой-то причине он автоматически добавляет 0 в конец семантики. Мне кажется, что я ошибаюсь, потому что POSITIONT ясно описан здесь как допустимая семантика ввода:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx#PS
и это единственный, который не позволяет добавлять дополнительные целые числа в конце семантики.
РЕДАКТИРОВАТЬ: Я только что обнаружил, что если я изменю POSITIONT на POSITIONT1, он работает нормально. Это противоречит тому, что описано в документации выше.
Содержание simple.fx:
struct VertexShaderInput
{
float4 Position : POSITIONT;
float4 Color : COLOR0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
float4 Color : COLOR0;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
output.Position = input.Position;
output.Color = input.Color;
return output;
}float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
return input.Color;
}
technique Ambient
{
pass Pass1
{
VertexShader = compile vs_2_0 VertexShaderFunction();
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
Для Legacy Direct3D9 есть специальный D3DDECLUSAGE_POSITIONT
что означает просто пропустить обработку вершин. Поэтому вы можете использовать только POSITIONT
на входе PIXEL SHADER — т.е. его вообще нельзя использовать в шейдере VERTEX.
Измените свой шейдер, чтобы использовать POSITION
или же POSITION0
,