2014-09-11 120 views
1

我試圖用glAlphaBlend和他的所有參數使用alhpa蒙版。我在stackoverflow上發現了很多類似的答案,但我沒有意識到任何事情。我有三個圖像,背景(1),蒙版(2)和文字(3)。OpenGL Alpha蒙版

我想要的是繪製背景,減去我的面具到文本最終獲得圖像(A)。

Image Example

Draw background 

glClearColor(0,0,0,0); 
glClear(GL_COLOR_BUFFER_BIT); 
glClear(GL_DEPTH_BUFFER_BIT); 
glEnable(GL_BLEND); 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); 
glBegin(GL_QUADS); 
glColor4ub(0,0,0,255); 
glVertex2d(mxIncrust0 - bgwidth, myIncrust0); 
glVertex2d(mxIncrust0, myIncrust0); 
glVertex2d(mxIncrust0, myIncrust0 + textheight); 
glVertex2d(mxIncrust0 - bgwidth, myIncrust0 + textheight); 
glEnd(); 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 

glEnable(GL_BLEND); 
glBlendEquation(GL_FUNC_ADD); 
glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_ZERO, GL_ONE); 

Draw Text 

但任何工作!

實現它的真正方法是什麼?

+0

'但是任何東西都在工作!'這到底意味着什麼?你有什麼結果? SO上沒有媒體。 – Drop 2014-09-11 13:40:46

+0

我明白,我想說,我嘗試了堆棧中的每個答案,但任何事情都做對了! – Maypeur 2014-09-11 13:44:42

+0

然後告訴我們你有什麼。另外請注意,沒有「畫一個面具」這樣的東西。唯一繪製的是'Draw *'調用。你不需要畫一個面具。 Mask將在輸出合併階段與您的文本紋理結合(GL俚語中的「每樣本操作」)。在向我們展示繪製代碼和生成的截圖之前,我只能建議您查看一下opengl文檔:[Rendering Pipeline Overview](http://www.opengl.org/wiki/Rendering_Pipeline_Overview) – Drop 2014-09-11 13:49:28

回答

1

我終於找到了一個解決方案與glClipPlane,我沒有找到任何與着色器的解決方案,因爲它不是紋理。

那麼它是如何工作的? 1)我畫我的背景(四邊形,線條...) 2)我定義並激活一個限制低於沒有任何東西是在左邊繪製,並且沒有限制在右邊繪製 3)我繪製我需要的一切四邊形,線條,我的文字...) 4)我禁用剪輯。

// Draw the background 
double* leftMask = new double[4]; 
leftMask[0] = 1; 
leftMask[3] = -mClipXL; // Be careful to use -Limit for the left limit 
glClipPlane(GL_CLIP_PLANE0, leftMask); 
delete[] leftMask; 
glEnable(GL_CLIP_PLANE0); 

double* rightMask = new double[4]; 
rightMask[0] = -1; // Be careful to use -1 for the right limit 
rightMask[3] = mClipXR; 
glClipPlane(GL_CLIP_PLANE1, rightMask); 
delete[] rightMask; 
glEnable(GL_CLIP_PLANE1); 

// draw the text 

// disable the clip to draw anything else. 
glDisable(GL_CLIP_PLANE0); 
glDisable(GL_CLIP_PLANE1); 

它的工作非常好!

7

「真實的方式」來做到這一點是使用shader programsmodern OpenGL。爲什麼你使用過時的API?我們是在2014年用OpenGL 4.5的最新version.You甚至不能要求你計較向後兼容性,因爲即使是一些真正的舊卡(5歲以上),至少也支持GL 3.2,這是完全可編程的。即使使用GL 2.0,您仍然可以使用着色器,但是使用棄用的API會帶您如果您計劃在不久的將來爲您的生活編寫OpenGL,那麼無處不在。

現在,使用着色器,遮罩是最瑣碎的任務之一。 您通常通過2個紋理入片段shader.1 - 漫反射紋理(實際的紋理,以覆蓋的表面)2 - 面膜紋理(也許單通道灰度紋理)

片段着色器是這樣的:

#version 150 
uniform sampler2D maskTex; 
uniform sampler2D colorTex; 

out vec4 colorOut; 
in smooth vec2 texCoords; 
void main(){ 

    vec4 color = texture(colorTex,texCoords); 
    vec4 mask = texture(maskTex,texCoords); 

    colorOut =vec4(color.rgb,color.a * mask.r);//alpha value can be in any channel ,depends on texture format. 
} 

儘可能簡單,希望它有幫助。

P.S確保你也是mipmap alpha紋理,以防漫反射貼圖被mipmapped。 也請注意我的例子並不是爲了解決您的具體任務,而是爲了向您展示如何在可編程OpenGL中完成基本的遮罩。從這裏很容易弄清楚要做什麼;)

+0

非常感謝您的完整回覆,我使用着色器找到了相似的例子。它似乎是可以理解的,但我的第一個問題是,對於文本,它不是一個紋理,我用一個基本的gl_quad生成我的面具! PS:它沒有解決我尋找的方式,但它看起來是第一個更高性能的,第二個是你對未來更好的說法。我會在接下來的幾天內嘗試... – Maypeur 2014-09-12 09:17:10