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.
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. –
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. –
float4 (float3, 1.0f); jest poprawna składnia HSLS, ale nie mogę znaleźć dokumentu msdn na ten temat. – Stardidi