2013-02-07 150 views
5

我有一個像素着色器,它應該簡單地傳遞輸入顏色,但是我得到的是恆定的結果。我認爲我的語法可能是問題。這裏是着色器:通過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; 
} 

爲了測試,我有頂點着色器,在經過0.5,0.5,0.5顏色參數的pipleline前面這一點。在VisualStudio中逐個像素着色器,input.color具有正確的值,並且正確地將這些值分配給output.color。但是,渲染時,使用此着色器的頂點全部爲黑色。

這裏是頂點着色單元描述:

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

我不知道這是否是重要的頂點着色器採用顏色RGB輸出相同,但像素着色器輸出RGBA。阿爾法層至少工作正常。

如果我註釋掉第一個賦值,即使用input.color,並使用顯式值取消註釋其他賦值,那麼呈現的像素是灰色的(如預期的那樣)。

任何想法,我在做什麼錯在這裏?

我正在使用着色器模型4級別9_1,禁用了優化並啓用了調試信息。

回答

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

輸入。顏色是個float4和要傳遞到另一個float4變量,我認爲這應該工作

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

這一切,如果你想改變顏色,你需要通過它直通只是

return input.color; 

紅色然後做類似

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

我從來沒有見過這種構造

float4(input.color, 1.0f); 

這可能是問題,但我可能是錯的。嘗試通過一個類似這樣的傳遞浮點值之一:

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

編輯:

事實上,你可能需要使用float4變量的類型COLOR(http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx

+0

謝謝雪人。我在那裏的float4初始化我直接從VS2012附帶的Direct3D樣本中獲取。我試着改變你提到的那個,但得到相同的結果。 –

+0

我修改了我的代碼,使頂點聲明現在具有DXGI_FORMAT_R32G32B32A32_FLOAT的顏色,並且修改了着色器,並返回float4而不是float3,但輸出中沒有更改。 –

+0

float4(float3,1.0f);是正確的HSLS語法,但我找不到它的msdn文檔。 – Stardidi

1

*您確定您的頂點是在他們應該是的地方?你開始讓我懷疑我的D3D知識。 :P 我相信你的問題是你只傳遞一個顏色, 這兩個着色器的一部分需要一個位置才能工作。 您的PixelShaderInput佈局應爲: struct PixelShaderInput { float4 position:SV_POSITION; float3 color:COLOR; }; *

你能也許嘗試這是您的像素着色器?:

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

我已驗證像素着色器不需要SV_POSITION輸入。 –

+0

不知道這是一個問題,但你可以嘗試更換您象素的Shader: 個float4主(FLOAT3顏色:彩色):SV_TARGET { \t回個float4(顏色,1.0F); } – Stardidi

相關問題