2014-03-06 172 views
0

我有一個粒子系統在背景紋理上渲染。每個粒子都是正方形,沒有紋理應用於它,它們都是相同的顏色。背景是灰度紋理。 我想要實現的是在應用程序(如Gimp)中已知的混合類型,即顏色混合模式。Opengl ES混色模式

基本上,由粒子覆蓋的背景區域應保持其亮度,但採用粒子的顏色。 我試過幾個glBlendFunc()參數的組合,並嘗試用glTexEnv搞亂,但我在理解它時遇到了很多麻煩。 目前,如果兩個粒子重疊,它們或者變亮或變暗(取決於glBlendFunc參數)。

我在android上使用OpenGL ES 1.1。沒有任何方法可以在不使用OpenGL ES 2.0的情況下實現這種效果?如果是這樣,那是什麼?

回答

0

glBlendFunc只支持可分離的混合模式。僅色調混合是不可分離的,所以它不能用標準OpenGL表示。見Nvidia的馬克·基爾加德this presentation,滑動41

Nvidia公司提供了其新的GPU擴展(包括Tegra的),叫NV_blend_equation_advanced它增加了GL_HSL_HUE_NV和​​令牌來執行你所描述的操作。鑑於你希望保持對OpenGL ES 1.1的支持,這實際上不適合你。

然而,也有可能是一種方式來實現你的描述,考慮到影響你的背景是灰度:

  1. 從RGB的粒子顏色轉換爲HSL色彩空間
  2. 最大化亮度HSL(即將其設置爲 1.0 0.5)
  3. 轉換回RGB。這將是您的實際粒子顏色
  4. 畫你的粒子用乘法混合操作:glBlendFunc(GL_DST_COLOR, GL_ZERO)

這應該保持亮度而畫與粒子的顏色背景。

編輯:glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR)會給2 *源*目標顏色,這可能會有所幫助。

編輯2:儘量glTexEnvf如下

  1. 渲染背景glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
  2. 使用glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)

它已經超過十年,因爲我最後一次使用glTexEnv渲染粒子,但也有可能成爲可以實現你想要做的事情的參數組合。

+0

在第二步,如果我在HSL中最大化亮度,不要得到純白色?轉換回RGB我得到(255,255,255)。所以我嘗試使用HSV色彩空間並使值最大化,但粒子重疊時背景變暗。 – Davide

+0

你是對的,在HSL中應該是0.5的明亮度,而不是1.0(這是純白色的)。值爲1.0的HSV應該給出相同的結果。這個想法是,用純色進行乘法應該不會導致亮度的變化。這隻適用於純色(你可以很容易地驗證,例如RGB =(255,0,0)。) –

+0

我得到所需的效果,但只有顏色(255,0,0),(0,255,0)和(0,0,255)。如果我在HSL中使用(204,0,255)(288º,100%,50%)之類的東西,重疊會變得更暗。 – Davide