2013-05-21 4 views
1

Я пишу PixelShader (HLSL, SM40) и стараюсь полностью пропускать вывод в некоторых случаях. Мой текущий код выглядит следующим образом:Можно ли пропускать цветопередачу в пиксельном шейдере?

float4 PS(PS_INPUT input) : SV_Target 
{ 
    float4 result=float4(1,1,1,0); 
    if(input.Col.r >= 0.999998f) 
     result=float4(0,0,0,0); 
    return result; 
} 

Но это будет просто писать черные пиксели не видели (как черный BackgroundColor здесь). Но в некоторых случаях пиксель был окрашен ранее, пиксели стали явно черными. Мое намерение состоит в том, чтобы затем пропустить запись в rendertarget. Есть ли способ, чтобы пропустить это, например, код может выглядеть следующим образом, не работает один:

float4 PS(PS_INPUT input) : SV_Target 
{ 
    float4 result=float4(1,1,1,0); 
    if(input.Col.r >= 0.999998f) 
     return; //or 'return null;' 
    return result; 
} 

Edit - теперь у нас есть работать (неоптимизированная, чтобы сохранить его качество) образец:

float4 PS(PS_INPUT input) : SV_Target 
{ 
    float4 result=float4(1,1,1,0); 
    if(input.Col.r >= 0.999998f) 
     discard; 
    return result; 
} 

ответ

4

Это может быть достигнуто с помощью встроенной функции clip (doc) или с элементом управления потоком discard (doc). В вашем случае clip должно быть лучше всего подходит :)

+0

работает как очарование, я собирался «отбросить»; вместо «возврата»; в образце :) 10q – thewhiteambit

+1

Используйте клип на совместимых с D3d10 картах, поскольку он имеет гораздо лучшую производительность, чем при управлении потоком. – MHGameWork

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