Я пытаюсь скомпилировать очень простой шейдер эффектов, ориентированный на DirectX9 и шейдерную модель 2. Я пытаюсь передать непосредственно координаты экрана для вершинных позиций вместо умножения на мир, представление и так что я использую семантику POSITIONT вместо семантики POSTION0 в структуре VertexShaderInput. Однако, когда я пытаюсь скомпилировать шейдер с помощьюЯвляется ли это ошибкой в компиляторе эффектов DirectX9? «Недопустимая семантика ввода - POSITIONT0»
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
и это только один, который не позволяет использовать дополнительные целые числа, которые будут добавляться в конце семантический.
EDIT: Я только что обнаружил, что если я изменю 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();
}
}
Я нацелился на DX3D9, и я использовал D3DECLUSAGE_POSITIONT в моем замедлении вершин. Я экспериментировал больше и по какой-то причине, если я использую POSITIONT1, он работает нормально. Что действительно странно, так как документация, связанная с выше, кажется, подразумевает, что вы не можете использовать пронумерованный POSITIONT –
'' D3DECLUSAGE_POSITIONT'' в объявлении вершин означает, что вы не используете вершинный шейдер ... Это странный особый случай, который датируется назад к конвейеру с фиксированной функцией. Лучше всего использовать '' D3DECLUSAGE_POSITION'', '' POSITION'', а затем использовать уже пройденный шейдер верстки. –