2017-05-04 174 views
1

因此,我正在做一个JOGL项目,在该项目中,我正在绘制一艘可以升起/下沉并在地图中移动的潜艇 - 注意这张地图只是一个巨大的quad_strip。无论如何,我有下面的代码进行混合。试图将潜水艇部分淹没在水中

gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glEnable(GL2.GL_BLEND); 
    gl.glDisable(GL2.GL_DEPTH_TEST); 

    gl.glColor4f(0.949f, 0.816f, 0.588f, 1f); 
    gridFloor.display(drawable); 

    submarine.setHeight(subHeight); 
    submarine.display(drawable); 

    gl.glColor4f(0.298f, 0.7333f, 0.909f, 0.04f); 
    gridSea.display(drawable); 

    gl.glFlush(); 

注意:gridfloor,submarine和gridsquare对象都是GLEventListners。

所以这一切都很好,很棒。当它打印时,我已经定位了潜艇在y = 2和y = 1.5时的海平面。所以这时的潜艇应该在水线之上。但这是我所取而代之的。 enter image description here

正如你可能会说,我对JOGL很陌生,任何帮助将大量赞赏。

编辑:这就是我想实现

enter image description here

回答

2

当禁用深度测试,任何你绘制到屏幕绘制在什么是已经存在的顶部。这就是为什么水正在被吸引到潜艇上。

gl.glDisable(GL2.GL_DEPTH_TEST); 

解决方案:不要禁用深度测试。

+0

老师引用 - “通过启用混合和禁用深度测试,使海面 表面半透明。” -_-谢谢你,很喜欢 –

+0

@RyanTurnbull:难道你的老师不会理解混合,在某个时刻和它一起苦苦挣扎,并且认为加入了深度测试功能的加成并不会显得完全错误?无论如何,正确的方法来渲染透明的东西是通过*深度测试__enabled __ *和*排序*混合几何*远到近*。 – datenwolf