Làm cách nào để sử dụng kiểm tra độ sâu và độ trong suốt của kết cấu trong thế giới 2.5D của tôi?


11

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_TESTGL_BLENDkế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ó).

vấn đề chồng chéo minh bạch

Đâ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?


2
Chỉ cần một nhận xét để nói với bạn rằng tôi đã đi chính xác giống như bạn đối với công cụ 2D của mình: trước tiên hãy cố gắng khéo léo và tự sắp xếp các ô Z, sau đó nhận ra không có lý do gì để cảnh bị xẹp, do đó, cho các ô của tôi Phối hợp Z và kích hoạt thử nghiệm alpha. Không chắc chắn liệu bạn có đúng không, nhưng bạn không đơn độc :-)
sam hocevar

Câu trả lời:


7

OK, đây là giải pháp của tôi (vui lòng bình luận nếu nó có thể được thực hiện tốt hơn) ...

Thực tế là tôi thực sự nên sử dụng thử nghiệm alpha (mặc dù, tôi đã phát hiện ra điều này một cách tình cờ, vì vậy tôi không hoàn toàn chắc chắn tại sao nó hoạt động).

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_ALPHA_TEST);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl10.glAlphaFunc(GL10.GL_GREATER, 0);

    // ...
    // bind texture and create vertices
    // ...
}

Lưu ý việc sử dụng GL_ALPHA_TEST, và glAlphaFunc.


Nó cũng giải quyết vấn đề của tôi. Cám ơn vì đã chia sẻ. Bạn thật tuyệt
Mathlover

2

Kiểm tra Alpha được sử dụng để dừng trình kết xuất vẽ các pixel vào bất kỳ bộ đệm nào, kể cả bộ đệm z. Pha trộn Alpha chỉ là một thứ trực quan - các giá trị vẫn được ghi vào zbuffer, điều này có thể dẫn đến các vấn đề như thế này - các pixel vô hình nằm trước các pixel được hiển thị sau đó có nghĩa là chúng sẽ thất bại ztest khi bạn vẽ các pixel mới. Đây là những gì bạn có thể thấy trong hình ảnh bạn đã đưa ra, một ztest thất bại.

Tắt viết z cũng sẽ đạt được kết thúc tương tự nhưng bạn phải đảm bảo bạn rút mọi thứ int trở lại trật tự trước. Điều này là đủ dễ dàng để làm trong trò chơi isometric của bạn.


1
Tôi nghĩ rằng việc vẽ các công cụ từ sau ra trước thật dễ dàng trong trò chơi iso 2D chỉ khi bạn có một mặt phẳng Y cố định và nhà thiết kế có toàn quyền kiểm soát thế giới. Tuy nhiên, khi công cụ có thể tồn tại ở bất cứ đâu trong không gian 3D và bạn cho phép người dùng thay đổi nội dung, việc này trở nên phức tạp hơn. Tôi nghĩ rằng sử dụng bộ đệm sâu sẽ làm cho cuộc sống của tôi dễ dàng hơn rất nhiều.
Nick Bolton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.