2012-07-07 33 views
6

Chúng tôi có ứng dụng vẽ iOS. Hiện tại, bản vẽ được thực hiện với OpenGL ES 1.1. Chúng tôi sử dụng một số thuật toán để làm mịn các đường như đường cong Bezier. Vì vậy, khi sự kiện chạm xảy ra, chúng tôi nhận được một số điểm ngoài điểm sự kiện cảm ứng (dựa trên thuật toán) và vẽ các điểm này. Chúng tôi cũng sử dụng kết cấu bàn chải cho các điểm để có cái nhìn tự nhiên hơn.Dòng kết cấu mượt mà với các bóng đổ OpenGL ES 2.0

Tôi tự hỏi liệu có thể triển khai các thuật toán này trong trình đổ bóng OpenGL ES 2.0 hay không. Một cái gì đó giống như để gọi một chức năng OpenGL để vẽ đường làm bằng các điểm tiếp xúc và trên đầu ra đã làm mịn đường cong kết cấu bàn chải kết xuất.

enter image description here

điểm P0, P1, ... P4 đây là những sự kiện liên lạc và các điểm trên đường cong màu đỏ - điểm đầu ra, với bước như vậy cho T sao cho khoảng cách giữa hai điểm trên đường cong người hàng xóm không lớn hơn 1 pixel.

Và đây là liên kết với Bezier thuật toán giải thích: Bézier curve - Wikipedia, the free encyclopedia

Bất kỳ giúp đỡ được nhiều đánh giá cao. Cảm ơn.

+0

Bạn có thể cụ thể hơn không? Chúng tôi không thể cho bạn biết liệu có thể thực hiện một thuật toán cụ thể trong trình đổ bóng nếu chúng tôi không biết thuật toán là gì! – user1118321

+0

Nó thực sự không có vấn đề gì thuật toán chúng tôi sử dụng. Điểm ở đây là trình đổ bóng sẽ tạo ra nhiều điểm hơn trên đầu ra so với điểm đầu vào. Tôi đã chỉnh sửa câu hỏi của mình và thêm một ví dụ với thuật toán Bezier. –

Trả lời

6

Bạn không thể tạo các đỉnh mới bên trong trình đổ bóng đỉnh (bạn có thể thực hiện nó trong trình đổ bóng hình học mà ES không có). Số lượng đỉnh đầu ra luôn giống như số lượng đỉnh đầu vào, bạn chỉ có thể thay đổi vị trí của chúng (và thuộc tính tuyệt đối của khóa học).

Vì vậy, bạn sẽ phải vẽ một đường kẻ được tạo thành từ đủ các đỉnh để đảm bảo đường cong trơn tru đủ. Những gì bạn có thể làm là đặt luôn luôn cùng một dải đường, có giá trị tham số đường cong T là vị trí đỉnh 1D. Trong shader bạn sử dụng vị trí đầu vào này (giá trị tham số) để tính toán vị trí 2D/3D thực tế trên đường cong sử dụng thuật toán DeCasteljau (hoặc bất kỳ) và điểm P0 đến P4 mà bạn đưa vào shader như hằng số trong điều khoản GLSL).

Nhưng tôi không chắc liệu điều đó có thực sự giúp bạn mua bất cứ thứ gì ngoài việc tính toán các điểm trên CPU và đưa chúng vào một VBO động. Những gì bạn lưu là việc sao chép các điểm cong từ CPU sang GPU và tính toán trên CPU, nhưng mặt khác, đổ bóng đỉnh của bạn phức tạp hơn nhiều. Nó cần phải được đánh giá đó là cách tiếp cận tốt hơn. Nếu bạn cần tính đường cong mỗi khung hình (vì các điểm điều khiển thay đổi mỗi khung hình) và đường cong là chi tiết khá cao, có thể đó không phải là một ý tưởng tồi. Nhưng nếu không tôi không nghĩ rằng nó thực sự trả tiền. Và cũng shader của bạn sẽ không thể thích nghi dễ dàng đến một số thay đổi của các điểm kiểm soát/độ cong tại thời gian chạy.

Nhưng một lần nữa, bạn không thể đặt 5 điểm kiểm soát và tạo ra các điểm đường cong N trên GPU. Trình đổ bóng đỉnh luôn hoạt động trên một đỉnh và kết quả trong một đỉnh, giống như trình đổ bóng mảnh luôn hoạt động trên một đoạn duy nhất (nói pixel, mặc dù nó chưa phải là một phần) và dẫn đến một đoạn (hoặc không) .

+0

Cảm ơn câu trả lời rất toàn diện! Tôi đang tìm cách để làm cho mã rõ ràng hơn và cũng đạt được một số hiệu suất. Nhưng, như tôi thấy, đây không phải là trường hợp. Nhân tiện, bạn đề xuất phương pháp tiếp cận rất thú vị, đi qua dòng 1D đại diện cho T. Tôi sẽ nghĩ về nó. –

+0

Chắc chắn :) Tôi chỉ cần nhấn enter để viết từ dòng mới và nó đã gửi bình luận :) Cảm ơn một lần nữa! –

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