2016-06-13 68 views
0

我一直工作在一個遊戲引擎爲教育目的,我碰到這個問題,我似乎無法找到一個答案:OpenGL - 如何創建與訂單無關的透明度?

Alpha通道只適用於已經擁有的對象之前繪製的對象alpha通道(例如:在一個有3個物體的場景中,我們說一隻貓,一隻狗和一個瓶子(透明的),貓和狗都在瓶子後面;狗首先被拉出,瓶子第二次被拉出,貓第三隻,只有狗會通過瓶子看到)。

下面是這個問題的一個畫面: The objects are drawn in the order they appear in the list box

我用C++發動機,Win32 API中的編輯器和GLSL的陰影:

// some code here 
vec4 alpha = texture2D(diffuse, texCoord0).aaaa; 
vec4 negalpha = alpha * vec4(-1,-1,-1,1) + vec4(1,1,1,0); 

vec4 textureComponentAlpha = alpha*textureComponent+negalpha*vec4(1,1,1,0);//(texture2D (diffuse, texCoord0)).aaaa; 

gl_FragColor = (textureComponentAlpha + vec4(additiveComponent.xyz, 0)) * vec4(lightingComponent.xyz, 1); 

在C++:

glEnable(GL_ALPHA_TEST); 
glDepthFunc(GL_EQUAL); 

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

我認爲它與alpha測試的方式或類似的東西有關。

請問誰能幫我解決這個問題?

+1

我不確定你在問什麼。訂單獨立透明既不便宜也不易實施,當然超出了本網站的答案範圍。 – Quinchilion

+0

我面臨同樣的問題,我的解決方案涉及遞歸多遍渲染,模板,裁剪和很多數學。書可以寫在這樣的技術上,而且確實可能​​是這樣。 OpenGL不只是神奇地爲你做這一切。如果你正在尋找一個簡單的解決方案,恐怕沒有一個。 – Entropy

+0

我在這裏回答了一些簡單的透明度渲染方法的概述:http://stackoverflow.com/questions/23280692/opengl-es2-alpha-test-problems。 –

回答

3

我使用類似的答案由@RetoKoradi評論鏈接的東西,但我得到了雙層透明模型與貼圖(玻璃內外表面)與全固態機械和東西周圍。

對於這樣的場景,我使用的也是多通道方法,Z排序是通過設置正面順序完成的。

  1. 渲染所有固態物體
  2. 渲染所有透明物體

    這是棘手的部分第一I設置

    glGetIntegerv(GL_DEPTH_FUNC,&depth_funct); 
    glDepthFunc(GL_ALWAYS); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_CULL_FACE); 
    

    我得到的幾何形狀的層分開存儲(內外)所以Z排序是這樣完成的:

    • 渲染外層與glFrontFace(GL_CW);
    • 後端面渲染內層與glFrontFace(GL_CW);
    • 後端面渲染內層前與glFrontFace(GL_CCW);
    • 面對渲染外層前與glFrontFace(GL_CCW);

    並且最後面恢復

    glDisable(GL_BLEND); 
    glDepthFunc(depth_funct); 
    
  3. 渲染所有的固體物體再次

它遠非完美,但足以讓我的目的,它看起來像這樣:

example

0

我不完全確定這會幫助你的情況,但你有混合和alpha啓用?如:

glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

我已經使用此設置。我更新了這個問題。謝謝你的想法! – laurGanta