我正在使用OpenGL ES 1.1在我的iPad應用程序中畫線。我想要確保畫出的線條總是在屏幕上可見,而不管背景顏色如何,並且不允許用戶選擇顏色。是否有混合功能可以產生這種效果?所以繪製線的顏色將根據已繪製的顏色而變化,因此始終可見。OpenGL ES混合函數所以顏色總是顯示背景
回答
不幸的是,片段最終融合到幀緩衝區仍然是固定功能。此外,glLogicOp
沒有在ES中實現,所以你不能做像XOR繪圖這樣便宜的東西。
我覺得最終效果是:
- 你想要的輸出顏色是顏色已經在幀緩衝區的自定義功能;
- 但幀緩衝區不能在着色器中讀取(它會中斷流水線並導致併發問題)。
因此,你將不得不實施乒乓管道。
你有兩個離屏緩衝區。一個代表您輸出的最後一幀,另一個代表您在此之前輸出幀的內容。
生成一個新的幀,使用前一幀表示的幀作爲輸入。因爲它是一個輸入,所以你可以在任何你想要的地方對它進行採樣,並對它進行任何你喜歡的計算。你渲染到你擁有的其他緩衝區(即更老的緩衝區),因爲你不再關心它的內容。
然後,您將所有內容複製到屏幕上,並將兩者交換,這意味着您剛繪製的內容仍然位於紋理中,以指代您繪製的最後一幀。你剛剛提到的內容成爲你的下一個繪圖目標,因爲這是你方便已經存在的東西。
因此,您將立即對呈現紋理感興趣。您還需要決定要使用哪種功能爲現有背景選擇合適的「不同」顏色。也許只是顛倒它會做什麼?
我覺得這可能是工作:
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
用白色畫出你的線,然後將結果將呈現爲
[1,1,1,1] * (1 - [DstR, DstG, DstB, DstA]) + ([DstR, DstG, DstB, DstA] * 0)
這應該呈現黑色像素其中背景爲白色,背景爲黑色的白色像素,背景爲藍色的黃色像素等。
當我試過這個東西時,它使橡皮擦,這意味着無論我刷筆刷哪裏都是透明的。此外,它不再將紋理應用於畫筆。我不認爲我在執行你的想法錯誤.. glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0f,1.0f,1.0f,1.0f); –
你的評論聽起來不像你原來的問題。什麼刷子?我以爲你在畫線。你是什麼意思,它'不應用紋理刷'?你沒有提到有關紋理的任何內容。 – Tim
好的抱歉,我不知道我在這個問題上有多少細節。我正在繪製線條,但使用「筆刷」(類似於流行的GLPaint示例)。 「畫筆」使用一種紋理,對畫出的線條應用了不錯的形狀。我並不認爲這些信息會影響我正在嘗試做的事情,因此我將它排除在外。對困惑感到抱歉。並且,「不應用紋理刷」,我的意思是現在正在繪製紋理的大小的正方形而不是紋理內的形狀,但這不是一個問題。 –
- 1. 背景顏色並不總是顯示
- 2. OpenGL混合單色顏色
- 3. Android ListView的背景顏色總是顯示灰色
- 4. Qt樣式表背景顏色總是顯示爲黑色
- 5. OpenGL ES 1.0上的混合函數(Android)
- 6. OpenGL背景顏色推子
- 7. 通過背景顏色在文字上顯示背景顏色
- 8. OpenGL ES的顏色
- 9. 混合OpenGL ES 1和OpenGL ES 2
- 10. 如何停止Android上的OpenGL ES繪圖背景顏色?
- 11. OpenGL ES 2.0,在改變背景時不會改變顏色
- 12. 將導航欄顏色混合到背景顏色(漸變?)
- 13. 將Windows窗體背景顏色設置爲混合顏色?
- 14. 顏色在OpenGL ES中不能正確混合
- 15. OpenGL ES 2.0,與所有東西混合
- 16. div背景圖像顯示出來,但背景顏色不是
- 17. Seekbar只顯示進度顏色而不顯示背景顏色
- 18. Opengl ES混色模式
- 19. ,如何清除DC的背景顏色。所以,繪製的文本將不顯示背景顏色
- 20. Android/Java:確定文本顏色是否會與背景混合?
- 21. Android OpenGL ES透明背景
- 22. OpenGL es 2.0混合問題
- 23. Alpha與OpenGL ES 2.0混合?
- 24. OpenGL ES 2.0的混合
- 25. CSS背景顏色沒有顯示?
- 26. 覆蓋div不顯示背景顏色
- 27. JFrame背景顏色不顯示
- 28. 顯示圖像的背景顏色 - CSS
- 29. Div包裝背景顏色不顯示
- 30. 爲什麼背景顏色不顯示?
謝謝,會給它一個鏡頭。 –