2009-09-14 29 views
1

我想用使用OpenGLES的白色背景上的紋理畫筆,以我選擇的顏色進行繪製。如何在白色背景上打開Open GL ES中的彩色紋理畫筆?

我有一個位圖圖像,我使用CG加載並轉換爲紋理。該位圖大部分是黑色的,但在我想用作「畫筆」的中心有一個白色圓圈。換句話說,我希望黑色部分在最終合成中消失,但白色部分採用我使用glColor設置的顏色。

設置一些不透明的明亮顏色是灰色(不是純白色背景)上的褪色線後,我可以得到的最好是混合參數(GL_SRC_ALPHA,GL_ONE)。但是當我將背景設置爲純白色時,線條不可見。

至少在當前情況下,原始紋理的黑邊不會出現。我嘗試的大多數其他混合組合導致即使在灰色中也沒有顯示出來,或者看到包括黑色邊緣在內的整個畫筆,這是不好的。

是否有人願意向我解釋我應該如何設置我的紋理和/或GL狀態,使純白色的亮色顯示,而不顯示黑色紋理邊緣?這可能是一個新手問題,但我已經嘗試通過混合數學來解決問題,但我仍然不明白顏色是如何被一起考慮的。

下面是我使用作爲刷圖像:

alt text http://www.coldcoffeeandjuice.com/OpaqueBrush.png

這裏的一些得到的輸出,當背景爲灰色,並且glColor4f被設置爲(1,0,0,1) ,例如純紅色,並且刷子被用於一串連續的GL_POINT。請注意,這樣做的好處是隻有畫筆圖像的白色部分顯示紅色 - 這是正確的。壞的部分是由於與背景(?)和/或畫筆的白色(?)混合在一起,所以我想要變得純淨和明亮的紅色變得蒼白,以便當背景是純白色時完全洗掉。這使用上面給出的混合參數(src_alpha,one)。

alt text http://www.coldcoffeeandjuice.com/palered.png

這裏就是我想看到的,考慮到純紅色(感謝畫筆):

alt text http://www.coldcoffeeandjuice.com/brightred.png

誰能幫我明白我做錯了嗎?

謝謝!

+0

你能發佈一些圖片展示你期望看到什麼以及你真正看到了什麼? – Justicle 2009-09-21 01:04:35

+0

完成。如果我在這裏錯過任何重要信息,請告訴我。我是一名優秀的程序員,但在圖形數學和總理狀態方面有一席之地。 – 2009-09-21 01:30:53

+0

嗨本,我也在尋找這個解決方案,但我不能使用示例應用程序「GLPaint」得到正確的結果。你可以分享你設置OpenGL環境的代碼部分嗎? – strange99 2009-09-30 11:34:01

回答

3

好的,所以你正試圖用指定的顏色(在這個例子中是「紅色」)將一個給定的顏色「繪製」到背景上,使用一個面具來畫刷形狀。

您需要在開始渲染「漆」之前做到以下幾點:

  1. 首先確保你的畫筆具有隨其形狀對應的alpha通道 - 即alpha通道應該類似於你提出的畫筆圖像。

  2. 與這些狀態設置渲染(注意空間來解決wiki標記):

// Make the current material colour track the current color 
glEnable(GL_COLOR_MATERIAL); 

// Multiply the texture colour by the material colour. 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

// Alpha blend each "dab" of paint onto background 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

參見:
http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/colormaterial.html

http://www.khronos.org/opengles/documentation/opengles1_0/html/glTexEnv.html

+0

Justicle--謝謝。這實現了我正在尋找的效果 - 查找混合時,我沒有遇到過在API中使用「材質」材質的提及。 您能否爲我解釋一下 - 因爲我無法自己弄清楚數學問題,或者在線搜索中找到答案 - 爲什麼發佈在問題中的原始技術表現得如此呢?我想了解那裏究竟發生了什麼。 謝謝! – 2009-09-21 14:18:32

+0

很高興爲你效勞 - 去年我寫了一個位圖字體渲染器,發現了所有這些難題。我不能真正地說出你原來的代碼出了什麼問題,因爲我不知道你在做什麼。 如果您好奇,我會消除我概述的每一步(反過來)並嘗試反向設計您的錯誤。 – Justicle 2009-09-21 23:19:37

+0

我想我應該指出,重要的「着色」操作是由'glTexEnvf'調用啓用的。每個紋理元素乘以當前顏色 - 所以白色(1,1,1,1)x顏色(R,G,B,A)=(R,G,B,A);和黑色(0,0,0,0)x顏色=黑色(0,0,0,0)。其他部分只是使着色能夠實際工作。 – Justicle 2009-09-21 23:32:54