2012-06-15 2 views
5

Wir schreiben ein einfaches 3D-Spiel als ein Projekt in einem Kurs, den wir an der Universität machen. (Die Zuordnung ist für Paare) wir JOGL verwenden müssen, so muss ich die Arbeit mit dieser API (Lösungen wie: Umstellung auf höhere Level-API wie JAVA3D wird nicht gut für mich sein ...) Wie auch immer, das Spiel, das wir implementieren wollten, ist eine Art 3D-Shooter. (der Code bisher, der von einem früheren Auftrag, den wir für den gleichen Kurs gemacht haben, gespalten wurde, findet man hier: http://code.google.com/p/mirzhcode/source/browse/?repo=cgex4) und jetzt versuche ich mich mit "Spezialeffekten" zu beschäftigen. genauer Partikel & Sprites (für das Schießen, Explosionen, etc‘...) i über eine Erklärung in Bezug auf Sprite-Emitter kam, die ich umsetzen will: http://bit.ly/KrrPM4java + JOGL, wie wird die Transparenz eingestellt, um Objekte in der Szene zu zeigen, anstatt einfach schwarz, wenn eine Textur gezeichnet wird?

i mit begann, wie es schien, die einfach zu sein Teil. der Shockwave-Ring, der aus einem einzigen schnell wachsenden Sprite besteht. Wenn ich versuche, das Bild, das ich gemacht habe, zu zeichnen, bekomme ich schwarzen Hintergrund statt der Transparenz, die ich wollte. das Texturbild ist eine transparente PNG-Datei (so gibt es einen Alpha-Kanal) shockwave png file with alpha transperancy und was ich von ihm erhalten ist: enter image description here der Code i dies zu generieren verwendet:

in init() Methode:

//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(); 

und auch in display() Methode:

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(); 

zu su m it up, meine Frage ist, wie bekomme ich die Textur zu verwenden, es ist Alpha-Kanal, und wenn es nicht so einfach ist, gibt es eine Bibliothek, die Sie vielleicht wissen, dass ich verwenden kann?

Antwort

3

Nachdem ich ein bisschen mehr gegraben hatte, wurde mir klar, was ich tun musste. apparent, wenn Sie Bilder mit OpenGL mischen, ist es mit dem Rahmen verschmilzt so weit gerendert. so ist die Reihenfolge der Zeichnung wichtig. ich habe dieses Bild am Anfang der Anzeigemethode gerendert, und ich hätte das am Ende stellen sollen. Also, wenn jemand wissen möchte, wie man transparente Objekte zeichnet, dann stelle sicher, dass du sie zuletzt zeichnest. Falls es transparente Objekte gibt, müssen Sie sie in der Reihenfolge zeichnen. weiter weg von der Kamera sollte zuerst gezeichnet werden. after the fix

Verwandte Themen