gil*_*och 5 java opengl transparency sprite jogl
我们正在写一个简单的3D游戏作为我们在大学学习的课程.(分配给夫妻)我们必须使用JOGL,所以我必须使用这个API(解决方案如:切换到更高级别的API,如java3D对我不好......)无论如何,我们决定的游戏实现是某种3D射击游戏.(到目前为止,我们为同一课程的上一个作业分配的代码可以在这里找到:http://code.google.com/p/mirzhcode/source/browse/?repo = cgex4)现在我我试图处理"特效".更准确地说,粒子和精灵(用于射击,爆炸等......)我遇到了关于精灵发射器的解释,我想实现:http://bit.ly/KrrPM4
我开始时似乎很容易.冲击波环,由一个快速生长的精灵组成.当我试图绘制我制作的图像时,我得到黑色背景而不是我想要的透明度.纹理图像是一个透明的png文件(所以有一个alpha通道)
我得到的是:
我用来生成这个代码:
在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();
Run Code Online (Sandbox Code Playgroud)
以及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();
Run Code Online (Sandbox Code Playgroud)
总而言之,我的问题是如何让纹理使用它的alpha通道,如果它不是那么简单,你可能知道我可以使用的库吗?
经过更多挖掘后,我意识到我需要做什么。显然,当您使用 openGL 混合图像时,它会混合到目前渲染的帧中。所以绘图的顺序很重要。我在显示方法的开头渲染了这个图像,我应该把它放在最后。所以无论如何,如果有人想知道如何绘制透明对象,请确保最后绘制它们。如果有多个透明物体,则必须按顺序绘制。应首先绘制离相机较远的位置。
