java+JOGL,绘制纹理时如何设置透明度以显示场景中的对象而不是纯黑色?

标签 java opengl transparency jogl sprite

我们正在编写一个简单的 3D 游戏,作为我们在大学学习的类(class)中的一个项目。 (此作业适用于情侣) 我们必须使用 JOGL,所以我必须使用这个 API(解决方案例如:切换到更高级别的 API,例如 java3D 对我来说不是很好... ) 总之,我们决定实现的游戏是某种 3D 射击游戏。 (到目前为止的代码是从我们之前为同一类(class)所做的作业派生而来的,可以在这里找到:http://code.google.com/p/mirzhcode/source/browse/?repo=cgex4) 现在我正在尝试处理“特殊效果”。 更准确地说,粒子和 Sprite (用于射击、爆炸等……) 我遇到了一个关于 Sprite 发射器的解释,我想实现它:http://bit.ly/KrrPM4

我从看似简单的部分开始。冲击波环,由单个快速增长的 Sprite 组成。 当我尝试绘制我制作的图像时,我得到黑色背景而不是我想要的透明度。 纹理图像是一个透明的 png 文件(所以有一个 alpha channel ) shockwave png file with alpha transperancy 我从中得到的是: enter image description here 我用来生成这个的代码:

init() 方法中:

//loading textures
try {
    shockwave = TextureIO.newTexture(new File( "textures/shockwave_128X128.png" ),false);
} catch (GLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

gl.glShadeModel(GL.GL_SMOOTH);
gl.glClearColor(0f, 0f, 0f, 1f);
gl.glClearDepth(1.0);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
gl.glHint(GL.GL_POINT_SMOOTH_HINT, GL.GL_NICEST);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glEnable(GL.GL_DEPTH_TEST);

//UNCOMMENT THE FOLLOWING LINE OF CODE
//FOR REALISTIC COLORS. NOTE THAT ICC
//BUTTON WON'T CHANGE THE COLORS ANYMORE.

//gl.glEnable(GL.GL_LIGHTING);

//two (soft) lights (red and blue) setup.
//each in an opposite corner of the room.
float color0[] = {1f, 0f, 0f, 0.5f};
float ambient0[] = {1.0f, 1.0f, 1.0f, 0.5f};
float position0[] = {(float) (0.95*expansionFactor), (float) (0.95*expansionFactor), (float) (0.95*expansionFactor)};

float color1[] = {0f, 0f, 1f, 0.5f};
float ambient1[] = {1.0f, 1.0f, 1.0f, 0.5f};
float position1[] = {(float) (0.95*expansionFactor), (float) (0.95*expansionFactor), (float) (0.95*expansionFactor)};

gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient0,1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE,color0 , 1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, color0 , 1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position0, 1);

gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, ambient1,1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE,color1 , 1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, color1 , 1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, position1, 1);

gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(GL.GL_LIGHT1);

start();

还有 display() 方法:

gl.glEnable(GL.GL_BLEND);
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
shockwave.bind();

gl.glColor4f(1f,1f,1f,1f);

gl.glBegin(GL.GL_QUADS);
gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3d(0.0-10, 0.2, 0.0-10);
gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3d(0.0+10, 0.2, 0.0-10);
gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3d(0.0+10, 0.2, 0.0+10);
gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3d(0.0-10, 0.2, 0.0+10);
gl.glEnd();

总而言之,我的问题是如何让纹理使用它的 alpha channel , 如果不是那么简单,是否有您可能知道我可以使用的图书馆?

最佳答案

在进一步挖掘之后,我意识到我需要做什么。 显然,当您使用 openGL 混合图像时,它会混合到目前渲染的帧中。 所以绘画的顺序很重要。 我在显示方法的开头渲染了这张图片,我应该把它放在最后。 所以无论如何,如果有人想知道如何绘制透明对象,请确保最后绘制它们。 如果有多个透明物体,则必须按顺序绘制。远离相机应首先绘制。 after the fix

关于java+JOGL,绘制纹理时如何设置透明度以显示场景中的对象而不是纯黑色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11050578/

相关文章:

python - 小行星程序使用间接绘制,glMultiDrawArraysIndirect不渲染并绘制空白

html - 在背景上带有透明边框的圆圈

java - Maven 和 Spring,使用 @FormDataParam 会导致缺少依赖项错误

java - 初始化复杂过滤器时出错。从 Kotlin 运行 ffmpeg 时出现无效参数错误

c - OpenGL 扩展,如何在 C 和 glsl 中正确使用它们

opengl - 如何使这段代码在 Mesa3d 上工作?

java - 如何在 JFrame 上正确显示 PNG

Python:反转具有透明背景的图像(PIL,Gimp,...)

java - 模拟 nmcli --ask 在网络管理器的直接 dbus 控制中

java - 如何在构建项目时构建和安装maven依赖?