2015-08-03 5 views
0

Я пытаюсь скомпилировать очень простой шейдер эффектов, ориентированный на 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(); 
    } 
} 

ответ

2

Для наследия Direct3D9 есть специальный D3DDECLUSAGE_POSITIONT, что означает просто пропустить обработку вершин. Поэтому вы можете использовать только POSITIONT в входе PIXEL SHADER - т. Е. он вообще не может использоваться в VERTEX SHADER.

Измените шейдер, чтобы использовать POSITION или POSITION0.

+0

Я нацелился на DX3D9, и я использовал D3DECLUSAGE_POSITIONT в моем замедлении вершин. Я экспериментировал больше и по какой-то причине, если я использую POSITIONT1, он работает нормально. Что действительно странно, так как документация, связанная с выше, кажется, подразумевает, что вы не можете использовать пронумерованный POSITIONT –

+0

'' D3DECLUSAGE_POSITIONT'' в объявлении вершин означает, что вы не используете вершинный шейдер ... Это странный особый случай, который датируется назад к конвейеру с фиксированной функцией. Лучше всего использовать '' D3DECLUSAGE_POSITION'', '' POSITION'', а затем использовать уже пройденный шейдер верстки. –