2013-02-07 24 views
5

Posiadam moduł cieniujący pikseli, który powinien po prostu przekazać kolor wejściowy, ale zamiast tego uzyskuję stały wynik. Myślę, że moja składnia może być problemem. Oto shader:Przekazywanie kolorów za pomocą modułu cieniującego pikseli w języku 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; 
} 

Do testowania, mam vertex shader, który poprzedza ten w pipleline przechodzącej parametr kolor 0,5, 0,5, 0,5. Przechodząc przez pikselowy program cieniujący w VisualStudio, input.color ma poprawne wartości i są one prawidłowo przypisywane do output.color. Jednak po wyrenderowaniu wierzchołki korzystające z tego modułu cieniującego są czarne.

Oto vertex shader elementem opis:

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

Nie jestem pewien, czy to ważne, że moduł cieniujący wierzchołek zajmuje kolory jako wyjścia RGB takie same, ale RGBA wyjścia Pixel Shader. Warstwa alfa działa poprawnie co najmniej.

Jeśli skomentuję to pierwsze przypisanie, używając parametru input.color i odkomentuję inne przypisanie, z wartościami jawnymi, to renderowane piksele są szare (zgodnie z oczekiwaniami).

Wszelkie pomysły na temat tego, co robię źle tutaj?

Używam modułu cieniującego 4 poziom 9_1, z wyłączonymi optymalizacjami i włączonymi informacjami debugowania.

Odpowiedz

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

swój wkład.Kolor jest float4 i przechodzą do innego float4, myślę, że to powinno działać

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

to wszystko, czego potrzebujesz, aby przekazać go thru prostu

return input.color; 

jeśli chcesz zmienić kolor czerwony, następnie wykonaj coś w rodzaju:

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

Nigdy nie widziałem tego rodzaju konstruktora

float4(input.color, 1.0f); 

to może być problem, ale mogę się mylić. Spróbuj przechodzącą wartości pływaka jeden po drugim jak ten:

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

Edit:

Właściwie może trzeba użyć float4 jako typ na kolor (http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx)

+0

Dzięki Yeti. Inicjalizacja float4, którą mam tam, wzięłam bezpośrednio z próbki Direct3D dostarczanej z VS2012. Próbowałem przejść do tego, o którym wspomniałeś, ale otrzymuję ten sam rezultat. –

+0

Zmodyfikowałem swój kod tak, że deklaracja wierzchołków ma teraz kolor jako DXGI_FORMAT_R32G32B32A32_FLOAT, a ja zmieniłem shadery tak, aby pobierały i zwracały float4 zamiast float3, ale bez zmian w wynikach. –

+0

float4 (float3, 1.0f); jest poprawna składnia HSLS, ale nie mogę znaleźć dokumentu msdn na ten temat. – Stardidi

1

* Czy jesteś pewien, że wierzchołki są w miejscu, w którym powinni być? Zaczynasz sprawiać, że wątpię w moją wiedzę o D3D. : P Wierzę, że Twoim problemem jest to, że przechodzisz tylko kolor, OBECNE części modułu cieniującego POTRZEBUJĄ pozycji, aby działać. Twój układ PixelShaderInput powinien być: struct PixelShaderInput { pozycja float4: SV_POSITION; float3 color: COLOR; }; *

mógłbyś może spróbować tego jako pixel shader ?:

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

Sprawdziłem, że moduł cieniujący pikseli nie wymaga wejścia SV_POSITION. –

+0

Nie jestem pewien, czy jest to problem, ale można spróbować wymienić ty z Pixel Shader: float4 główny (kolor float3: KOLOR): SV_TARGET { \t float4 powrotnej (kolor, 1.0f); } – Stardidi