2012-06-15 37 views
5

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) shockwave png file with alpha transperancy y lo que me sale de ella es: enter image description here 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?

Respuesta

3

Después de cavar un poco más, me di cuenta de lo que tenía que hacer. aparentemente, cuando mezcla imágenes con OpenGL, se mezcla con el fotograma procesado hasta el momento. por lo que el orden del dibujo es importante. hice esta imagen al principio del método de visualización, y debería haber puesto esto al final. así que de todos modos, si alguien quiere saber cómo dibujar objetos transparentes, asegúrese de dibujarlos al final. en caso de que haya numerosos objetos transparentes, debe dibujarlos en orden. más lejos de la cámara debe dibujarse primero. after the fix

Cuestiones relacionadas