2016-06-13 75 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