2012-04-29 37 views
11

Vui lòng xem xét những hình ảnh sau đây để minh họa: enter image description hereSản xuất hiệu ứng tẩy bằng libgdx và OpenGL ES

Ban đầu tôi lấp đầy toàn bộ màn hình/sân khấu với hình ảnh cá nhân cho đến khi màn hình chuyển sang màu hồng. Mỗi đốm màu hồng là một diễn viên Hình ảnh cá nhân mà tôi thêm vào giai đoạn.

Bây giờ tôi muốn triển khai phương pháp touchDown theo cách mà mỗi khi người dùng chạm vào màn hình, nó sẽ xóa một phần của Hình ảnh đó nơi sự kiện chạm diễn ra. Tuy nhiên, sự kiện cảm ứng đó không ảnh hưởng đến các Hình ảnh/diễn viên/TextureRegions khác phía sau hoặc phía trên các diễn viên blob hồng. Làm thế nào tôi phải đạt được điều này trong libgdx bằng cách sử dụng OpenGL ES? Xin hãy giúp tôi trong vấn đề này.

Tôi tìm thấy liên kết này giải thích cách sửa đổi một TextureRegion nhưng tôi không biết làm thế nào tôi sẽ đạt được giải pháp cho vấn đề của tôi bằng cách sử dụng kỹ thuật được giải thích trong blog này. Here is the link

+0

Mở liên lạc, bạn có muốn hình ảnh hoàn chỉnh được "xóa"? Việc xóa có nghĩa là viết các giá trị trắng cho các pixel hoặc làm cho chúng trong suốt không? Bạn đang sử dụng OpenGL ES 2? libgdx dường như hỗ trợ nó. –

+0

@StefanHanke No. Tôi định xóa chỉ một phần của hình ảnh nơi sự kiện chạm xảy ra. Và tôi muốn làm cho chúng trong suốt hơn là tô màu trắng để nền trở nên rõ ràng. – Rafay

+0

Có thể dễ dàng hơn nếu bạn biết màu nào sẽ bị xóa ngay bây giờ .. – Ronnie

Trả lời

5

Bạn có thể sử dụng bộ đệm của FBO và stencil không?

Thiết lập FBO cho lớp "hồng" của bạn và bộ đệm stencil cho lớp đó. Khi chạm xuống, hãy chạm vào mặt nạ của bạn dưới dạng mặt nạ cho bộ đệm stencil màu hồng của FBO. Bây giờ khi bạn vẽ FBO màu hồng, các khu vực bạn chạm vào sẽ không được hiển thị để bạn có thể thấy FBO nền phía sau nó.

này liên kết http://www.opengl.org/archives/resources/faq/technical/rasterization.htm, phần 14,050 cho bạn biết làm thế nào để thiết lập một bộ đệm stencil:

Bạn có thể thiết lập trạng thái OpenGL như sau:

glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_ALWAYS, 0x1, 0x1); 
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 

vẽ sau đó sẽ thiết lập một bit 1 trong bộ đệm stencil cho mỗi pixel được hiển thị.

Bạn có thể phải fiddle với những thứ để mặt nạ của bạn đi ra đúng cách (mặt nạ mà bạn đã liên lạc, không phải là nơi bạn thì không.)

+0

Ý tưởng ba xếp chồng lên nhau (XYZ) chính xác là những gì tôi muốn. Bây giờ bạn đang thảo luận về bộ đệm ở đây, liệu thao tác có đủ mượt để không gây ra chuỗi hiển thị để tạo ra một jitter đáng chú ý không? Vì tôi tương đối mới với OpenGL ES, tôi không biết làm thế nào bộ đệm hoạt động nên tôi sẽ phải thử mọi thứ từ một vết xước hoàn chỉnh. Vấn đề là tôi phải chắc chắn rằng cách tiếp cận này là tốt nhất cho những gì tôi muốn làm ở đây. Theo như bộ đệm FBO và stencil có liên quan, có tôi có thể sử dụng chúng nhưng tôi không biết làm thế nào. Dưới đây là vài tài liệu tham khảo cho bộ đệm FBO và stencil trong khuôn khổ. – Rafay

+0

http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/graphics/glutils/FrameBuffer.html http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/ utils/BufferUtils.html http://www.badlogicgames.com/wordpress/?p=1923 Tôi đã tìm cách thực hiện việc này bằng bộ đệm như bạn đã đề xuất. – Rafay

+1

Bây giờ tôi nghĩ về nó nhiều hơn một chút, bạn không thực sự cần ba FBO, chỉ một với một bộ đệm stencil để phù hợp. Tôi đã chỉnh sửa câu hỏi để được tốt hơn. Câu trả lời này có một số công cụ về hiệu suất FBO http://stackoverflow.com/a/2203931/959304 nhưng tôi sẽ bỏ qua hiệu suất cho đến khi hoạt động của nó, và nếu hiệu suất xấu, _then_ trả thêm mã phức tạp sẽ đến khi bạn muốn để tối ưu hóa. – Soup

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