2015-01-20 6 views
0

По какой-то причине рендеринг, кажется, игнорирует семантику для первого аргумента и всегда передает положение пикселя. Даже если другой аргумент имеет семантику SV_POSITION, позиция по-прежнему передается в качестве первого аргумента. Для этого есть причина?Первый аргумент для пиксельного шейдера HLSL

Vertex шейдеров:

cbuffer transforms 
{ 
    float4x4 view, projection; 
}; 

void main(
    in float4 inPos : POSITION, in float3 inNorm : NORMAL, 
    out float4 outPos : SV_POSITION, out float3 outNorm : TEXCOORD0 
    ) 
{ 
    outPos = mul(projection, mul(view, inPos)); 
    outNorm = inNorm; 
} 

Пиксельный шейдер:

void main(
    float4 inPos : SV_POSITION, in float3 inNorm : TEXCOORD0, 
    out float4 outClr : SV_TARGET 
    ) 
{ 
    outClr.xyz = inNorm * 0.5 + 0.5; 
    outClr.w = 1.0; 
} 

ответ

0

Это потому, что POSITION и SV_Position означают в основном то же самое. POSITION - семантика эпохи Direct3D 9 для вершинной позиции. SV_Position - семантика эры Direct3D 10+ для вершинной позиции.

Вы можете использовать несколько различных моделей здесь, но идти с рисунком, вы должны использовать inout для позиции:

void main(
    inout float4 pos : SV_Position, in float3 inNorm : NORMAL, 
    out float3 outNorm : TEXCOORD0 
    ) 
{ 
    pos = mul(projection, mul(view, pos)); 
    outNorm = inNorm; 
} 

Кроме того, вы должны быть согласованы с использованием HLSL из POSITION vs. SV_Position в вашем вершинном шейдере и как вы объявляете свои макеты ввода Direct3D 10.x/11.x, а также ваш VS против PS, чтобы они могли правильно привязываться.

+0

Таким образом, даже если дескриптор входного элемента использует '' POSITION ', 0', я должен все же указать 'SV_Position' в VS? –

Смежные вопросы