Lưu ý: Tôi đã tìm thấy câu trả lời (mà tôi sẽ đăng sau câu hỏi này) - Tôi chỉ tự hỏi liệu mình đã làm đúng hay chưa, nếu có cách nào tốt hơn.
Tôi đang tạo một trò chơi isometric "2.5D" bằng OpenGL ES (JOGL). Theo "2.5D", ý tôi là thế giới là 3D, nhưng nó được hiển thị bằng cách sử dụng các ô đẳng cự 2D.
Vấn đề ban đầu tôi phải giải quyết là kết cấu của tôi phải được hiển thị theo thứ tự (từ sau ra trước), để các ô xếp chồng lên nhau đúng cách để tạo hiệu ứng phù hợp. Sau khi đọc, tôi nhanh chóng nhận ra rằng đây là cách tiếp cận 2D "chiếc mũ cũ". Điều này trở nên khó thực hiện một cách hiệu quả, vì thế giới 3D có thể được người chơi sửa đổi (vì vậy mọi thứ có thể xuất hiện ở bất cứ đâu trong không gian 3D) - vì vậy có vẻ hợp lý khi tôi tận dụng bộ đệm sâu. Điều này có nghĩa là tôi không phải lo lắng về việc kết xuất đồ theo đúng thứ tự.
Tuy nhiên, tôi phải đối mặt với một vấn đề. Nếu bạn sử dụng GL_DEPTH_TEST
và GL_BLEND
kết hợp với nhau, nó sẽ tạo ra một hiệu ứng trong đó các đối tượng được trộn với nền trước khi chúng được "sắp xếp" theo thứ tự z (có nghĩa là bạn có một kiểu chồng chéo kỳ lạ trong đó độ trong suốt phải có).
Đây là một số mã giả sẽ minh họa vấn đề (tình cờ, tôi đang sử dụng libgdx cho Android).
create() {
// ...
// some other code here
// ...
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glEnable(GL10.GL_BLEND);
}
render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
// ...
// bind texture and create vertices
// ...
}
Vì vậy, câu hỏi là: Làm thế nào để tôi giải quyết vấn đề chồng chéo trong suốt?