2012-11-30 48 views
1

所以,我收集了一些我在openGL中製作的對象。他們每個人都有自己的顏色,並且他們中的一些人具有適用於他們的紋理。我想要做的是停止某些顏色到達屏幕,但仍然能夠改變它。有沒有一種方法可以挑選哪些顏色實際上被繪製?在OpenGL中製作彩色屏幕

我已經嘗試在鏡頭前放置一個半透明的平面,但它不會阻止其他顏色穿透 - 而是它與它們融合在一起。

在理想情況下,這是它如何工作:

紅色物體+紅色屏幕=紅色物體

藍色對象+紅色屏幕=灰色/黑色/白色物體

紫色對象+紅色屏幕=紅色物體

CNC中

爲了闡明我想要做的事情:我想讓所有對象的RGB值保持不變。但是,在將它們塗在屏幕上之前,我想將某些顏色值「歸零」,而不對對象進行任何實際更改。

因此,RGB [255,150,200]通過紅色濾鏡的對象將被繪製爲具有RGB值[255,0,0],綠色濾鏡[0,150,0]和藍色濾鏡[0 ,0,200]。

+0

「它如何工作......」的描述看起來很模糊。你能把它表示爲源和目標RGB(A)的函數嗎? –

+0

我用一些RGB值的例子編輯了這個問題。希望這有助於解釋我的問題。 –

+0

這對片段着色器應該是一個相當直接的任務。 – jaho

回答

1

您是否在尋找glColorMask?

看到這個答案:Render into a color channels without affecting other channels

我不是你的問題清楚,但是這將屏蔽掉/所選顏色通道:R,G,B或A


鑑於這種

因此,RGB [255,150,200]通過紅色濾鏡的對象將被繪製爲具有RGB值[255,0,0],綠色濾鏡[0,150,0]和藍色濾鏡[ 0,0,200]

glColorMask將工作。

glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); 
drawMyRedFilteredStuff(); 
// Return open gl state back to normal function 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 

如果您只需要通過紅色,綠色,藍色或阿爾法過濾,那麼這正是您正在尋找的。

我還沒有得到你想要做的?

+0

雖然glColorMask提供的效果很酷,但並不完全符合我的要求。這只是保持某些顏色通道不被編輯,直到它們被啓用。我需要的是停止opengl停止將某些顏色放到屏幕上。我需要_eliminate_我的場景中的任意數量的對象的兩個RGB組件... –

0

我認爲這將是最好的處理片段着色器。如果「過濾器」是一個恆定值,則可以將其設置爲均勻的,例如,

uniform vec3 filter_rgb; 
in vec3 src_rgb; 

out vec4 dst_rgba; 

void main (void) 
{ 
    dst_rgba = vec4(min(filter_rgb, src_rgb), 1.0); 
} 

因此,如果任何過濾器組件被設置成零,相應的輸出組件將爲零也。根據你想要的行爲,clamp函數可能比min函數更適合內建函數。

+0

從我所瞭解的着色器,我很確定這是我所需要的。你認爲你可以指示我(或給我自己)解釋如何在程序的主體中實現類似的東西嗎?就像如果我希望過濾器僅用於繪製片段的紅色組件,我將如何處理您的示例? –