2011-04-23 128 views
1

我使用開羅/ Pango爲使用OpenGL的文本顯示生成位圖。我生成的位圖爲RGBA,背景爲透明,文字爲黑色或白色。 (讓我們假設黑色)OpenGL - 紋理 - 用顏色代替黑色(白色)

如果我將這個位圖作爲OpenGL紋理加載並顯示出來,它就像預期的那樣顯示爲黑色文本或白色文本。

我希望能夠僅使用原始紋理對文本着色,但使用OpenGL照顧着色。

最好,我想使用glColor設置顏色,但我願意使用glBlendColor或GL_TEXTURE_ENV_COLOR。

但是,我不能得到任何這些選項的工作。

我有什麼嘗試看起來像是 無數組合 - 白色文本或黑色文本 - 使混合或使用GL_TEXTURE_ENV_MODE的GL_BLEND - 試圖GL_MODULATE,GL_REPLACE和GL_COMBINE - 嘗試各種不同的充glBlendFunc組合

我我一直在網上搜索和閱讀規範幾個小時,我真的在我的繩索結束。

任何人都可以將我指向正確的位置以獲得答案嗎?

回答

3

去最簡單的方法是讓你的文字位圖白色文字和透明背景。

然後,去色,你必須確保TEXTURE_ENV_MODE設置爲調節:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

這樣,繪製顏色會glColor * textureColor == glColor(因爲textureColor是白色的)

然後您必須啓用混合來處理您的透明背景:

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

,如果位圖是在預乘alpha形式:

glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
+0

這個答案有很大幫助。它幫助我找到最大的問題,這幾乎是我是個白癡......通常當我使用glColor時,我會做一些類似glColor(1.,0,0,0,0)的不透明紅色。這就是我之前所做的......但最終的0.將整個紋理上的alpha設置爲0.(因爲它正在倍增)。我確實需要使用glColor(1.,0,0,0,1 ),以便紋理中的任何alpha都能生效。哇,我覺得愚蠢。 – 2011-04-23 15:02:48

0

這聽起來像你可以創建位圖,只要你認爲合適。如果是這樣的話,我會把文字繪製到alpha通道上,而不是白底黑字。然後爲文本着色,繪製所需顏色的矩形(或其他)。然後在上面畫上你的紋理。紋理不透明的地方,你會得到紋理顏色。紋理透明的地方,背景顏色會顯示出來。

要做到這一點,您必須設置glBlendFunc。通常應罰款:

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

您還可以開啓混合的紋理:

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); 
1

代替供給充分RGBA組,讓文本只是determinine非/透明度,即只是提供一個alpha通道。然後使用正常的glColor設置文本顏色。

+0

以及如何做到這一點?這正是我要搜索的內容 – 2016-10-09 10:06:29

+0

@ProkopHapala:將字形柵格化爲灰度格式並將其上傳到GL_ALPHA格式紋理(固定函數OpenGL)或GL_RED格式紋理,並在片段着色器中將紋理的R分量分配給輸出片段的A組件。 – datenwolf 2016-10-09 12:19:35

+0

aha,好吧,使用fragmet着色器它可能很容易(雖然我沒有測試過),但我現在正在嘗試做現在的老式GL <2.0的方式。如果你有一些想法看看[這個問題](http://stackoverflow.com/questions/39943456/using-single-channel-texture-opengl-2) – 2016-10-09 12:26:31