Opengl 试图将部分淹没在水中的潜艇混合

Opengl 试图将部分淹没在水中的潜艇混合,opengl,graphics,jogl,Opengl,Graphics,Jogl,所以我在做一个JOGL项目,在这个项目中我画了一艘潜艇,它可以在地图上上升/下沉并移动,-注意,这张地图只是一个巨大的四边形条带 无论如何,我有以下代码来进行混合 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,

所以我在做一个JOGL项目,在这个项目中我画了一艘潜艇,它可以在地图上上升/下沉并移动,-注意,这张地图只是一个巨大的四边形条带

无论如何,我有以下代码来进行混合

    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、Subside和gridsquare对象都是GleventListner

所以这一切都很好。打印时,我将潜艇定位为y=2,海平面y=1.5。所以此时的潜艇应该在水线以上。但这是我得到的

正如你可能知道的,我对JOGL很陌生,任何帮助都将不胜感激

编辑:这就是我想要达到的目标


当您禁用深度测试时,您在屏幕上绘制的任何内容都将被绘制在已经存在的内容之上。这就是为什么水被吸引到潜艇顶部的原因

gl.glDisable(GL2.GL_DEPTH_TEST);

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

引用老师的话——“通过启用混合和禁用深度测试,使海面半透明。”——————————————非常感谢,工作了一段时间treat@RyanTurnbull字体可能是你的老师不懂混合,在某一点上与之抗争,并且认为启用深度测试的加性增压看起来不会完全错误吗?无论如何,渲染透明内容的正确方法是启用深度测试并将混合几何体从远到近排序。