Chúng tôi đang viết một trò chơi 3D đơn giản như một dự án trong một khóa học chúng tôi học tại trường đại học. (bài tập dành cho các cặp đôi) chúng tôi phải sử dụng JOGL, vì vậy tôi phải làm việc với API này (các giải pháp như: chuyển sang API cấp cao hơn như java3D sẽ không tốt cho tôi ...) dù sao, trò chơi chúng tôi quyết định thực hiện là một số loại game bắn súng 3D. (mã cho đến nay, được chia ra từ bài tập trước mà chúng tôi đã thực hiện cho cùng một khóa học có thể tìm thấy tại đây: http://code.google.com/p/mirzhcode/source/browse/?repo=cgex4) và bây giờ tôi đang cố gắng giải quyết "hiệu ứng đặc biệt". chính xác hơn, các hạt & sprites (đối với bắn súng, nổ, vv ...) tôi đã xem qua một lời giải thích về phát thải sprite, mà tôi muốn thực hiện: http://bit.ly/KrrPM4java + JOGL, cách đặt độ trong suốt để hiển thị đối tượng trong cảnh thay vì đồng bằng màu đen khi vẽ họa tiết?
tôi bắt đầu ra với những gì dường như là dễ dàng phần. vòng shockwave, bao gồm một sprite phát triển nhanh. khi tôi đang cố gắng vẽ hình ảnh tôi đã tạo, tôi có nền đen thay vì độ trong suốt mà tôi muốn. hình ảnh kết cấu là một file png trong suốt (vì vậy có một kênh alpha) và những gì tôi nhận được từ nó là: mã tôi sử dụng để tạo này:
trong init()
phương pháp:
//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();
và cũng trong display()
phương pháp:
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();
su m nó lên, câu hỏi của tôi là làm thế nào để tôi có được kết cấu để sử dụng nó là kênh alpha, và nếu nó không phải là đơn giản, là có một thư viện bạn có thể biết tôi có thể sử dụng?