Estamos escribiendo un juego 3D simple como proyecto en un curso que tomamos en la universidad. (La asignación es para parejas) tenemos que utilizar JOGL, por lo que tengo que trabajar con esta API (soluciones tales como: interruptor a un mayor nivel de API Java 3D como no será bueno para mí ...) De todos modos, el juego que decidimos implementar es una especie de tirador 3D. (el código hasta ahora, que se bifurca de una tarea anterior que hicimos para el mismo curso se puede encontrar aquí: http://code.google.com/p/mirzhcode/source/browse/?repo=cgex4) y ahora estoy tratando de lidiar con "efectos especiales". más precisamente, partículas & sprites (para fotografía, explosiones, etc' ...) me encontré con una explicación sobre los emisores sprite, que quiero poner en práctica: http://bit.ly/KrrPM4java + JOGL, ¿cómo establecer la transparencia para mostrar objetos en la escena en lugar de negro al dibujar una textura?
Empecé con lo que parecía ser el más fácil parte. el anillo de onda de choque, que se compone de un solo sprite de rápido crecimiento. cuando intento dibujar la imagen que hice, obtengo un fondo negro en lugar de la transparencia que quería. la imagen de textura es un archivo PNG transparente (por lo que hay un canal alfa) y lo que me sale de ella es:
el código que utiliza para generar esto:
en init()
método:
//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();
y también en display()
método:
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();
a su En mi opinión, mi pregunta es ¿cómo obtengo la textura para usar su canal alfa, y, si no es tan simple, ¿hay alguna biblioteca que pueda saber que puedo usar?