2013-02-07 23 views
5

Ho uno shader di pixel che dovrebbe semplicemente passare il colore di input, ma invece ottengo un risultato costante. Penso che la mia sintassi potrebbe essere il problema. Ecco dell'ombreggiatore:Passaggio di colori attraverso un pixel shader in HLSL

struct PixelShaderInput 
{ 
    float3 color : COLOR; 
}; 

struct PixelShaderOutput 
{ 
    float4 color : SV_TARGET0; 
}; 

PixelShaderOutput main(PixelShaderInput input) 
{ 
    PixelShaderOutput output; 
    output.color.rgba = float4(input.color, 1.0f); // input.color is 0.5, 0.5, 0.5; output is black 
    // output.color.rgba = float4(0.5f, 0.5f, 0.5f, 1); // output is gray 
    return output; 
} 

Per il test, ho vertex che precede questo nel pipleline passando un parametro di colore di 0.5, 0.5, 0.5. Passando attraverso il pixel shader in VisualStudio, input.color ha i valori corretti, e questi vengono assegnati correttamente a output.color. Tuttavia, durante il rendering, i vertici che utilizzano questo shader sono tutti neri.

Ecco il vertice descrizione elemento Shader:

const D3D11_INPUT_ELEMENT_DESC vertexDesc[] = 
{ 
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "COLOR",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
}; 

non sono sicuro se è importante che il vertex shader prende i colori come RGB emette lo stesso, ma le uscite pixel shader RGBA. Lo strato alfa funziona correttamente almeno.

Se commento questo primo compito, quello che usa input.color, e decommenta l'altro compito, con i valori espliciti, i pixel resi sono grigi (come previsto).

Qualche idea su cosa sto facendo male qui?

Utilizzo lo shader model 4 level 9_1, con le ottimizzazioni disattivate e le informazioni di debug abilitate.

risposta

2
output.color.rgba = float4(input.color, 1.0f); 

il vostro input.il colore è un float4 e si passa in un altro float4, credo che questo dovrebbe funzionare

output.color.rgba = float4(input.color.rgb, 1.0f); 

questo è tutto ciò che serve per passare attraverso semplicemente

return input.color; 

se si desidera cambiare il colore di rosso poi fare qualcosa come

input.color = float4(1.0f, 0.0f, 0.0f, 1.0f); 
return input.color; 
0

non ho mai visto questo tipo di costruttore

float4(input.color, 1.0f); 

questo potrebbe essere il problema, ma potrei sbagliarmi. Prova a passare i valori float uno per uno come questo:

float4(input.color[0], input.color[1], input.color[2], 1.0f); 

Edit:

In realtà si potrebbe essere necessario utilizzare float4 come tipo per il colore (http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx)

+0

Grazie Yeti. L'inizializzazione float4 che ho lì ho preso direttamente dal campione Direct3D fornito con VS2012. Ho provato a cambiare a quello che dici ma sto ottenendo lo stesso risultato. –

+0

Ho modificato il mio codice in modo tale che la dichiarazione del vertice ora abbia colore come DXGI_FORMAT_R32G32B32A32_FLOAT e ho modificato gli shader per prendere e restituire float4 anziché float3, ma nessuna modifica nell'output. –

+0

float4 (float3, 1.0f); è corretta sintassi HSLS, ma non riesco a trovare il msdn doc su di esso. – Stardidi

1

* Sei sicuro che i vertici sono nel posto in cui dovrebbero essere? Stai iniziando a farmi dubitare della mia conoscenza D3D. : P Credo che il tuo problema è che stai trasmettendo solo un colore, ENTRAMBI le parti dello shader HAI BISOGNO di una posizione per poter funzionare. Il layout di PixelShaderInput deve essere: struct PixelShaderInput { float4 position: SV_POSITION; colore float3: COLORE; }; *

Potrebbe magari provare questo come pixel shader ?:

float4 main(float3 color : COLOR) : SV_TARGET 
{ 
    return float4(color, 1.0f); 
} 
+0

Ho verificato che un pixel shader non richiede un input SV_POSITION. –

+0

Non sono sicuro se questo è il problema, ma potresti provare a sostituire si Pixel Shader con: float4 principale (float3 colore: COLORE): SV_TARGET { \t float4 ritorno (colore, 1.0f); } – Stardidi