比方說,我有一個多邊形這個紋理:渲染只有特定的紋理顏色 - OpenGL的
我將如何渲染多邊形,只允許藍色的光芒通過,並去飽和紅色顏色?我認爲這需要使用專門設計的OpenGL着色器。
對於具體的值是否有任何這方面的很好的例子,即如果藍色> 200和紅色< 20和綠色< 20然後再呈現該顏色,去飽和顏色。我會操縱顏色緩衝區嗎?
比方說,我有一個多邊形這個紋理:渲染只有特定的紋理顏色 - OpenGL的
我將如何渲染多邊形,只允許藍色的光芒通過,並去飽和紅色顏色?我認爲這需要使用專門設計的OpenGL着色器。
對於具體的值是否有任何這方面的很好的例子,即如果藍色> 200和紅色< 20和綠色< 20然後再呈現該顏色,去飽和顏色。我會操縱顏色緩衝區嗎?
是的,你可以設計一個着色器,並使用片段着色器做的(僞着色器):
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相同,因此您可以使用您的基本編程技巧來處理此類語句。
但是,這隻會呈現藍色的顏色到屏幕上,還是隻會返回藍色的像素?我困惑自己嗎? – 2012-01-30 21:41:28
所有的紅色部分都會變成黑色。我添加了一個使用透明度來隱藏內容的答案。 – Marnix 2012-01-30 21:48:34
謝謝。正是我在找的東西。 – 2012-01-30 21:50:25
你是什麼意思的「去飽和」?你的意思是「黑色」或「透明」還是什麼? – 2012-01-30 22:15:41
@NicolBolas也許我正在使用錯誤的名詞。當你在Photoshop中拍攝圖像並對其進行去色處理時。黑色/白色和灰色。 – 2012-01-30 22:40:16