2012-01-30 40 views
1

比方說,我有一個多邊形這個紋理:渲染只有特定的紋理顏色 - OpenGL的

img

我將如何渲染多邊形,只允許藍色的光芒通過,並去飽和紅色顏色?我認爲這需要使用專門設計的OpenGL着色器。

對於具體的值是否有任何這方面的很好的例子,即如果藍色> 200和紅色< 20和綠色< 20然後再呈現該顏色,去飽和顏色。我會操縱顏色緩衝區嗎?

+0

你是什麼意思的「去飽和」?你的意思是「黑色」或「透明」還是什麼? – 2012-01-30 22:15:41

+0

@NicolBolas也許我正在使用錯誤的名詞。當你在Photoshop中拍攝圖像並對其進行去色處理時。黑色/白色和灰色。 – 2012-01-30 22:40:16

回答

1

是的,你可以設計一個着色器,並使用片段着色器做的(僞着色器):

frag() 
{ 
    float4 color = tex2D(myTexture); 
    return float4(0,0,color.b,1); 
} 

這隻會回報您質地的藍色光譜。請注意,在片段着色器的色值總是質疑1

它返回的質感包含任何藍色部分0和1之間

答案。所以如果你的紅藍色紋理。它只會返回藍色部分,紅色部分會變成黑色。如果你有某種混合紋理,你會得到藍色的有色紋理。

我意識到你實際上並不想看到紅色的部分。你可以用不同的方式做到這一點。在HLSL中,有一個clip函數。但我不知道GLSL的同義詞。另一種方法是設置紋理的透明度,如下所示:

frag() 
{ 
    float4 color = tex2D(myTexture); 
    return float4(color.rgb, color.b); 
} 

這將使用紋理的藍色部分來確定透明度。由於紅色沒有藍色,紅色將完全隱形。藍色有1,所以它會完全可見。

回答問題2

,如果您有搖滾/石的紋理,你只想看到在一系列藍色像素,你應該做一個if語句。如果你想看到紋理的「藍色」,這個着色器就可以實現。

如果確實用於調試目的,最好使用第一個着色器,因爲它會將alpha值保持爲1.因此,不是透明度,而是變黑。

要使用只顯示了一系列的「藍色性」,你可以在if語句與上述顏色創建相結合:

frag() 
{ 
    float4 color = tex2D(myTexture); 
    float4 result; 

    if(color.b > 0.2f && color.b < 0.7f) 
    { 
     result = float4(0,0,color.b,1); // only return the blue part 
     // or 
     result = float4(color.rgb,1); // return the original color if blue is ok 
    } 
    else 
    { 
     result = float4(0,0,0,0); // fully transparent, won't show a thing 
    } 

    return result; 
} 

正如你可以看到,這是很容易使這些檢查。 GLSL與C相同,因此您可以使用您的基本編程技巧來處理此類語句。

+0

但是,這隻會呈現藍色的顏色到屏幕上,還是隻會返回藍色的像素?我困惑自己嗎? – 2012-01-30 21:41:28

+2

所有的紅色部分都會變成黑色。我添加了一個使用透明度來隱藏內容的答案。 – Marnix 2012-01-30 21:48:34

+0

謝謝。正是我在找的東西。 – 2012-01-30 21:50:25