大学で取っているコースのプロジェクトとして、簡単な 3D ゲームを書いています。(課題はカップル向けです) JOGLを使用する必要があるため、この API を使用する必要があります (次のような解決策: java3D などのより高いレベルの API に切り替えることは私には適していません...) とにかく、私たちが決めたゲーム実装するのは、ある種の 3D シューティング ゲームです。(これまでのコードは、同じコースで行った以前の課題から分岐したものです:http://code.google.com/p/mirzhcode/source/browse/?repo=cgex4)そして今私は「特殊効果」に取り組もうとしている。より正確には、パーティクルとスプライト (射撃、爆発などのため...) 実装したいスプライト エミッターに関する説明を見つけました: http://bit.ly/KrrPM4
私は簡単な部分と思われるものから始めました。急速に成長する単一のスプライトで構成される衝撃波リング。作成した画像を描画しようとすると、必要な透明度ではなく黒い背景が表示されます。テクスチャ イメージは透明な png ファイル (アルファ チャネルがあるため) であり、そこから得られるものは次 のとおりです。 これを生成するために使用したコードは次のとおりです。
メソッドで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();
要約すると、私の質問は、アルファ チャネルを使用するテクスチャを取得する方法です。それがそれほど単純でない場合、使用できるライブラリはありますか?