2013-02-07 48 views
5

Tôi có trình đổ bóng pixel chỉ cần chuyển màu nhập thông qua, nhưng thay vào đó tôi nhận được kết quả không đổi. Tôi nghĩ cú pháp của tôi có thể là vấn đề. Đây là trình đổ bóng:Chuyển màu thông qua trình đổ bóng pixel trong 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; 
} 

Để thử nghiệm, tôi có trình đổ bóng đỉnh đứng trước trong đường đi qua tham số COLOR 0,5, 0,5, 0,5. Bước qua các điểm ảnh shader trong VisualStudio, input.color có giá trị chính xác, và đây đang được assinged để output.color một cách chính xác. Tuy nhiên khi được hiển thị, các đỉnh sử dụng đổ bóng này đều có màu đen.

Đây là đỉnh mô tả yếu tố 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 }, 
}; 

Tôi không chắc chắn nếu điều quan trọng là các vertex shader có màu sắc như RGB kết quả đầu ra như nhau, nhưng các kết quả đầu ra pixel shader RGBA. Lớp alpha hoạt động chính xác ít nhất.

Nếu tôi nhận xét bài tập đầu tiên, bài tập sử dụng input.color và bỏ ghi chú khác, với giá trị rõ ràng, thì pixel được hiển thị có màu xám (như mong đợi).

Mọi ý tưởng về những gì tôi đang làm sai ở đây?

Tôi đang sử dụng mô hình trình đổ bóng 4 cấp 9_1, với bật tối ưu hóa và bật thông tin gỡ lỗi.

Trả lời

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

đầu vào của bạn.Màu sắc là một float4 và bạn đang đi qua nó vào float4 khác, tôi nghĩ rằng điều này sẽ làm việc

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

đây là tất cả các bạn cần phải vượt qua nó thông qua đơn giản

return input.color; 

nếu bạn muốn thay đổi màu sắc để màu đỏ sau đó làm điều gì đó như

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

Tôi chưa bao giờ thấy loại này của constructor

float4(input.color, 1.0f); 

này có thể là vấn đề, nhưng tôi có thể là sai. Hãy thử qua các giá trị float từng người một như thế này:

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

Edit:

Trên thực tế bạn có thể phải sử dụng float4 as type cho COLOR (http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx)

+0

Cảm ơn Yeti. Khởi tạo float4 mà tôi có ở đó, tôi đã lấy trực tiếp từ mẫu Direct3D đi kèm với VS2012. Tôi đã cố gắng thay đổi một trong những bạn đề cập đến nhưng tôi nhận được kết quả tương tự. –

+0

Tôi đã sửa đổi mã của mình sao cho khai báo đỉnh bây giờ có màu như DXGI_FORMAT_R32G32B32A32_FLOAT và tôi đã sửa đổi các trình đổ bóng để lấy và trả về float4 thay vì float3, nhưng không thay đổi đầu ra. –

+0

float4 (float3, 1.0f); là đúng cú pháp HSLS, nhưng tôi không thể tìm thấy tài liệu msdn trên đó. – Stardidi

1

* Bạn có chắc chắn rằng đỉnh của bạn ở nơi họ được cho là? Bạn đang bắt đầu làm cho tôi nghi ngờ kiến ​​thức D3D của tôi. : P Tôi tin rằng vấn đề của bạn là bạn chỉ chuyển một màu, Cả hai phần của trình đổ bóng CẦN một vị trí để hoạt động. Bố cục PixelShaderInput của bạn phải là: struct PixelShaderInput { vị trí float4: SV_POSITION; màu float3: COLOR; }; *

thể bạn có thể thử loại này như pixel shader của bạn ?:

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

Tôi đã xác minh rằng trình tạo pixel không yêu cầu đầu vào SV_POSITION. –

+0

Không chắc chắn đây có phải là sự cố hay không nhưng bạn có thể thử thay thế pixel đổ bóng bằng: float4 main (float3 color: COLOR): SV_TARGET { \t trả về float4 (màu, 1.0f); } – Stardidi

Các vấn đề liên quan