2013-02-05 27 views
7

Tôi đang cố gắng tạo lại GPUImageTwoPassFilter từ GPUImage(ios) cho Android. Tôi đang làm việc ra the work done here cho một cổng Android của GPUImage. Cổng thực sự hoạt động tốt cho nhiều bộ lọc. Tôi đã chuyển qua nhiều trình đổ bóng, về cơ bản phù hợp với thành công lớn.HaiPassFilter GPUImage thực sự làm gì?

Vấn đề là để chuyển một số bộ lọc, bạn phải mở rộng từ GPUImageTwoPassFilter từ GPUImage, tác giả của phiên bản Android chưa triển khai. Tôi muốn có một đâm vào viết nó, nhưng tiếc là phiên bản iOS là rất không có giấy tờ vì vậy tôi không thực sự chắc chắn những gì các bộ lọc TwoPass là nghĩa vụ phải làm.

Có ai có bất kỳ mẹo nào để thực hiện việc này không? Tôi có kiến ​​thức hạn chế về OpenGL, nhưng kiến ​​thức rất tốt về Android và iOS. Im chắc chắn tìm kiếm một mô tả rất psudocode ở đây

+0

+1 chúng tôi cần mọi người làm việc này cho android! Nó là một dự án mã nguồn mở tuyệt vời, đã sử dụng nó trên iOS và thiếu nó trên android –

+0

Thành thật mà nói, nếu bộ lọc này tồn tại, dự án sẽ có giá trị như nhau trên Android – Jameo

+0

'GPUImageMovieWriter' cũng rất có giá trị tùy thuộc vào trường hợp sử dụng, nhưng Đây là một khu vực nơi chuyển sang Android có thể chứng minh là ** rất ** khó khăn –

Trả lời

6

Tôi đoán tôi cần giải thích suy nghĩ của mình ở đây.

Như tên cho biết, thay vì chỉ áp dụng một thao tác đơn lẻ cho hình ảnh đầu vào, thao tác này chạy hai lần đổ bóng đối với hình ảnh đó, cái khác. Điều này là cần thiết cho các hoạt động như Gaussian blurs, nơi tôi sử dụng một hạt nhân có thể phân tách để thực hiện một đường ngang mờ và sau đó là một đường ngang (cắt giảm kết cấu đọc từ 81 đến 18 trên độ mờ 9 lần). Tôi cũng sử dụng nó để giảm hình ảnh thành thành phần độ sáng của chúng để phát hiện cạnh, mặc dù gần đây tôi đã thực hiện các bộ lọc phát hiện xem chúng có nhận được nội dung đơn sắc để làm cho tùy chọn đó không.

Do đó, điều này mở rộng cơ sở GPUImageFilter để sử dụng hai trình tạo khung hình và hai chương trình đổ bóng thay vì chỉ một trong mỗi chương trình. Trong lần truyền đầu tiên, việc kết xuất diễn ra giống như với GPUImageFilter chuẩn. Tuy nhiên, vào cuối đó, thay vì gửi kết quả kết quả tới bộ lọc tiếp theo trong chuỗi, kết cấu đó được lấy làm đầu vào cho lần truyền lại thứ hai. Bộ lọc chuyển sang chương trình đổ bóng thứ hai và chạy nó với kết quả đầu ra đầu tiên để tạo ra một kết cấu đầu ra thứ hai, cuối cùng được truyền vào như đầu ra từ bộ lọc này.

Bộ lọc chỉ ghi đè các phương thức của GPUImageFilter cần thiết để thực hiện việc này. Một điều khó khăn để xem ra là một thực tế rằng tôi chính xác cho vòng quay của hình ảnh đầu vào trong giai đoạn đầu tiên của bộ lọc, nhưng giai đoạn thứ hai không cần phải xoay hình ảnh một lần nữa. Đó là lý do tại sao có sự khác biệt về tọa độ kết cấu được sử dụng cho giai đoạn đầu tiên và thứ hai. Ngoài ra, các bộ lọc như các vết mờ mà mẫu theo một hướng có thể cần phải có các đầu vào lấy mẫu của chúng được lật tùy thuộc vào việc giai đoạn đầu tiên có xoay hình ảnh hay không.

Ngoài ra còn có một số tính năng tối ưu hóa bộ nhớ và bộ đệm ẩn trong đó, nhưng bạn có thể bỏ qua những điều đó một cách an toàn khi chuyển dữ liệu này sang Android.

+0

Bên cạnh việc không phải xoay hoặc dịch tọa độ trong bộ đệm khung hai lần (một cho mỗi lần truyền), điều này có khác biệt không? nhóm lọc? – Jameo

+0

@ Jameo - Không đáng kể, không. Tôi đã viết nó trước khi tôi tạo ra các nhóm lọc như một khái niệm. Nó có thể là một sợi tóc nhanh hơn bởi vì một chi phí thấp hơn một chút, nhưng không phải bởi một số tiền dễ nhận thấy. Nó làm cho nó, do đó bạn không cần phải tạo các loại bộ lọc tùy chỉnh cho các hoạt động phụ trong các nhóm, do đó, nó có thể làm cho khuôn khổ một chút sạch hơn. –

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