2011-10-10 30 views
5

Tôi đang sử dụng ParticleSystem với PointSprites (lấy cảm hứng từ Nguồn Cocos2D). Nhưng tôi tự hỏi cách xây dựng lại chức năng cho OpenGL ES 2.0GLSL PointSprite cho hệ thống hạt

glEnable(GL_POINT_SPRITE_OES); 
glEnableClientState(GL_POINT_SIZE_ARRAY_OES); 
glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2)); 
glDisableClientState(GL_POINT_SIZE_ARRAY_OES); 
glDisable(GL_POINT_SPRITE_OES); 

những điều này tạo ra BAD_ACCESS khi sử dụng ngữ cảnh OpenGL ES 2.0. Tôi có nên chỉ cần đi với 2 TRIANGLES cho mỗi PointSprite? Nhưng thats có lẽ không phải là rất hiệu quả (trên không cho các đỉnh phụ).

EDIT: Vì vậy, vấn đề mới của tôi với các giải pháp gợi ý từ: https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

là một khả năng để vượt qua nhiều kích cỡ khác nhau trong một cuộc gọi hàng loạt. Tôi nghĩ đến việc sử dụng một thuộc tính thay vì một bộ đồng phục, nhưng sau đó tôi sẽ cần phải vượt qua luôn luôn một PointSize để shaders của tôi - ngay cả khi tôi không vẽ GL_POINTS. Vì vậy, có thể một shader thứ hai (một shader chỉ cho GL_POINTS) ?! Tôi không nhận thức được chi phí cho việc chuyển đổi bóng râm mọi khung hình trong quá trình vẽ (bởi vì nếu hệ thống hạt được sử dụng, tôi muốn tự nhiên cũng hiển thị GL_TRIANGLES thông thường mà không có pointSize) ... Bất kỳ ý tưởng nào về điều này?

+1

này nên là những gì bạn đang tìm kiếm: http://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528 – rgngl

+0

Cảm ơn bạn! Liên kết đó rất hữu ích. Vì vậy, vấn đề duy nhất của tôi với giải pháp này là khả năng làm điều tương tự như "glPointSizePointerOES" trên GLSL (trên liên kết được đề xuất sử dụng đồng phục cho kích thước điểm - vì vậy nhiều điểm khác nhau với kích thước khác nhau không thể rút được trong cuộc gọi hàng loạt với glDrawArrays). Tôi nghĩ đến việc sử dụng một thuộc tính thay vì một bộ đồng phục, nhưng sau đó tôi sẽ cần phải vượt qua luôn luôn một PointSize để shaders của tôi - ngay cả khi tôi không vẽ GL_POINTS. Vì vậy, có thể một shader thứ hai (một shader chỉ cho GL_POINTS) ?! Bất kỳ ý tưởng về điều này? – Constantin

Trả lời

0

Vì vậy, làm điều ở đây như tôi đã nhận xét đây là những gì bạn cần: https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

Và đối với cách tiếp cận để đi, tôi có thể cho bạn biết sử dụng bóng đổ khác nhau với nhiều loại khác nhau của drawables trong ứng dụng của bạn, hoặc chỉ một bộ đồng phục boolean khác trong trình đổ bóng của bạn và bật và tắt thay đổi gl_PointSize thông qua mã trình đổ bóng của bạn. Nó thường tùy thuộc vào bạn. Những gì bạn cần lưu ý là việc thay đổi chương trình đổ bóng là một trong những hoạt động tốn kém nhất để thực hiện việc vẽ cùng một loại đối tượng trong một đợt sẽ tốt hơn trong trường hợp đó. Tôi không thực sự chắc chắn nếu sử dụng một tuyên bố if trong mã shader của bạn sẽ cung cấp cho một tác động hiệu suất rất lớn.

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