2012-06-15 20 views
5

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) shockwave png file with alpha transperancy và những gì tôi nhận được từ nó là: enter image description here 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?

Trả lời

3

sau khi đào nhiều hơn một chút, tôi đã nhận ra những gì tôi cần làm. cách ly, khi bạn pha trộn hình ảnh với openGL, nó được pha trộn với khung được hiển thị cho đến thời điểm này. để thứ tự bản vẽ là quan trọng. tôi đã hiển thị hình ảnh này ở đầu phương thức hiển thị và tôi nên đặt nó ở cuối. vì vậy dù sao, nếu có ai muốn biết cách vẽ các đối tượng trong suốt, hãy chắc chắn bạn vẽ chúng cuối cùng. trong trường hợp có các đối tượng trong suốt số, bạn phải vẽ nó theo thứ tự. xa hơn từ máy ảnh nên được rút ra đầu tiên. after the fix

Các vấn đề liên quan