2013-02-07 14 views
5

Ich habe einen Pixel-Shader, der einfach die Eingabefarbe durchlaufen sollte, aber stattdessen bekomme ich ein konstantes Ergebnis. Ich denke, dass meine Syntax das Problem sein könnte. Hier ist der Shader:Übergeben von Farben durch einen 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; 
} 

Zum Testen, ich habe die Vertex-Shader, dass dies in der pipleline Hindurchleiten eines Farbparameters von 0,5, 0,5, 0,5 vorausgeht. Beim Durchlaufen des Pixel-Shaders in VisualStudio hat input.color die korrekten Werte und diese werden output.color korrekt zugewiesen. Beim Rendern sind die Scheitelpunkte, die diesen Shader verwenden, jedoch alle schwarz. Hier

ist die Vertex-Shader-Element-Beschreibung:

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 }, 
}; 

Ich bin nicht sicher, wenn es wichtig ist, dass die Vertex-Shader nehmen Farben als RGB das gleiche gibt, aber die Pixel-Shader-Ausgänge RGBA. Die Alpha-Ebene funktioniert mindestens richtig.

Wenn ich diese erste Zuweisung auskommentiere, die input.color verwendet und die andere Zuweisung auskommentiert, mit den expliziten Werten, dann sind die gerenderten Pixel grau (wie erwartet).

Irgendwelche Ideen, was ich hier falsch mache?

Ich verwende Shader Model 4 Level 9_1, mit deaktivierten Optimierungen und Debug-Informationen aktiviert.

Antwort

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

Ihre Eingabe.Farbe ist ein float4 und Sie in eine andere float4 sind vorbei, ich denke, das

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

das alles funktionieren sollte, ist, Sie müssen es passieren durch einfach

return input.color; 

wenn Sie die Farbe ändern möchten, rot dann tu sowas wie

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

Ich habe noch nie diese Art von Konstruktor

gesehen
float4(input.color, 1.0f); 

dies könnte das Problem sein, aber ich könnte falsch sein. Versuchen Sie, die Float-Werte eins nach dem anderen wie folgt übergeben:

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

Edit:

Eigentlich könnte man verwenden float4 als Typ für COLOR (http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx)

+0

Danke Yeti. Die float4-Initialisierung, die ich dort habe, nahm ich direkt aus dem Direct3D-Beispiel, das mit VS2012 ausgeliefert wird. Ich habe versucht, zu dem zu wechseln, den du erwähnt hast, aber ich bekomme das gleiche Ergebnis. –

+0

Ich habe meinen Code so geändert, dass die Vertex-Deklaration jetzt die Farbe DXGI_FORMAT_R32G32B32A32_FLOAT hat, und ich habe die Shader so geändert, dass sie float4 statt float3 übernehmen und zurückgeben, aber keine Änderung in der Ausgabe. –

+0

float4 (float3, 1.0f); ist korrekt HSLS-Syntax, aber ich kann das msdn doc nicht finden. – Stardidi

1

* Sind Sie sicher, dass Ihre Eckpunkte an dem Ort, an dem sie sein sollen? Du fängst an, mich an meinem D3D-Wissen zu zweifeln. : P Ich glaube, Ihr Problem ist, dass Sie nur eine Farbe, BEIDE Teile des Shaders brauchen eine Position, um zu arbeiten. Ihr PixelShaderInput-Layout sollte folgendermaßen aussehen: struct PixelShaderInput { float4-Position: SV_POSITION; float3 Farbe: FARBE; }; *

Könnten Sie vielleicht versuchen, dies als Pixel-Shader ?:

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

Ich habe überprüft, dass ein Pixel-Shader keine SV_POSITION-Eingabe benötigt. –

+0

Nicht sicher, ob dies das Problem ist, aber könnten Sie versuchen Sie Pixel-Shader-Ersatz mit: float4 main (float3 Farbe: Farbe): SV_TARGET { \t Rückkehr float4 (Farbe, 1.0f); } – Stardidi