2013-08-20 100 views
1

繪製怎樣繪製漸變矩形(一個色調光譜實際上)是這樣的: enter image description here多梯度的DirectX

我想通過像素繪製它的像素,但它需要大量的時間(內存)。 我想用頂點緩衝區繪製4個不同的梯度矩陣,它應該是好的,但有沒有另一種方法來做到這一點?

+0

您可以嘗試使用1維紋理,包含您的漸變,然後將顏色與頂點一起傳遞,將紋理座標傳遞給此漸變紋理。然後你可以用一個矩形繪製它。 – user1837009

+0

如果您使用Direct2D,那簡直就是小菜一碟。 – zdd

回答

0

這樣的顏色效果在程序上很容易在像素着色器中實現。

  • 添加紋理座標的頂點聲明(如果它沒有它尚未),並將其分配給您的矩形:例如,左上角(0.0F,0.0F),右下(1.0F,1.0F ),右上(1.0F,0.0F)和左底部(0.0F,1.0F)
  • 像往常一樣,通過紋理座標從頂點着色器
  • 在像素着色器不變,將收到順利插紋理座標
  • 根據texcoord值設置你想要的任何顏色:在你的例子中你想要水平彩虹效果,所以在HSL系統中沿着水平c改變顏色的hue component元素(x)的紋理座標。然後將色調轉換爲RGB顏色。

這裏是我的GLSL着色器的代碼,用於HLSL(將vec3重命名爲float3並夾到飽和等)。請注意,它尚未作爲HLSL進行測試。

struct PSInput 
{ 
    float2 texcoord; 
}; 


float3 HueToRGB(in float h) 
{ 
    float3 rgb = 0.0f; 
    rgb.r = abs(h * 6.0f - 3.0f) - 1.0f; 
    rgb.g = 2.0f - abs(h * 6.0f - 2.0f); 
    rgb.b = 2.0f - abs(h * 6.0f - 4.0f); 
    rgb = saturate(rgb); 
    return rgb; 
} 

void main() : SV_Target 
{ 
    float3 colorRGB = HueToRGB(in.texcoord.x); 
    return float4(colorRGB, 1.0f); 
} 

在過去的顏色更多的控制,您可以:

  • 寫更復雜的像素着色器
  • 添加更多的頂點用不同的顏色成分(如Ylisar勸)。
  • 只是應用紋理

快樂編碼!

1

對於每種不同的顏色,添加一個包含該顏色作爲頂點數據的頂點對。在頂點着色器中,將該顏色轉發給像素着色器,並讓像素着色器將其簡單地輸出。由於屬性將從頂點着色器 - >像素着色器進行插值,因此您將獲得免費的漸變。

+0

你能給我一個示例代碼? – caccolona