2012-08-28 53 views
2

我正在使用OpenGL ES 1.1在我的iPad應用程序中畫線。我想要確保畫出的線條總是在屏幕上可見,而不管背景顏色如何,並且不允許用戶選擇顏色。是否有混合功能可以產生這種效果?所以繪製線的顏色將根據已繪製的顏色而變化,因此始終可見。OpenGL ES混合函數所以顏色總是顯示背景

回答

1

不幸的是,片段最終融合到幀緩衝區仍然是固定功能。此外,glLogicOp沒有在ES中實現,所以你不能做像XOR繪圖這樣便宜的東西。

我覺得最終效果是:

  • 你想要的輸出顏色是顏色已經在幀緩衝區的自定義功能;
  • 但幀緩衝區不能在着色器中讀取(它會中斷流水線並導致併發問題)。

因此,你將不得不實施乒乓管道。

你有兩個離屏緩衝區。一個代表您輸出的​​最後一幀,另一個代表您在此之前輸出幀的內容。

生成一個新的幀,使用前一幀表示的幀作爲輸入。因爲它是一個輸入,所以你可以在任何你想要的地方對它進行採樣,並對它進行任何你喜歡的計算。你渲染到你擁有的其他緩衝區(即更老的緩衝區),因爲你不再關心它的內容。

然後,您將所有內容複製到屏幕上,並將兩者交換,這意味着您剛繪製的內容仍然位於紋理中,以指代您繪製的最後一幀。你剛剛提到的內容成爲你的下一個繪圖目標,因爲這是你方便已經存在的東西。

因此,您將立即對呈現紋理感興趣。您還需要決定要使用哪種功能爲現有背景選擇合適的「不同」顏色。也許只是顛倒它會做什麼?

+0

謝謝,會給它一個鏡頭。 –

0

我覺得這可能是工作:

glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);

用白色畫出你的線,然後將結果將呈現爲

[1,1,1,1] * (1 - [DstR, DstG, DstB, DstA]) + ([DstR, DstG, DstB, DstA] * 0)

這應該呈現黑色像素其中背景爲白色,背景爲黑色的白色像素,背景爲藍色的黃色像素等。

+0

當我試過這個東西時,它使橡皮擦,這意味着無論我刷筆刷哪裏都是透明的。此外,它不再將紋理應用於畫筆。我不認爲我在執行你的想法錯誤.. glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0f,1.0f,1.0f,1.0f); –

+0

你的評論聽起來不像你原來的問題。什麼刷子?我以爲你在畫線。你是什​​麼意思,它'不應用紋理刷'?你沒有提到有關紋理的任何內容。 – Tim

+0

好的抱歉,我不知道我在這個問題上有多少細節。我正在繪製線條,但使用「筆刷」(類似於流行的GLPaint示例)。 「畫筆」使用一種紋理,對畫出的線條應用了不錯的形狀。我並不認爲這些信息會影響我正在嘗試做的事情,因此我將它排除在外。對困惑感到抱歉。並且,「不應用紋理刷」,我的意思是現在正在繪製紋理的大小的正方形而不是紋理內的形狀,但這不是一個問題。 –