2011-07-27 59 views
10

Tôi muốn tạo hiệu ứng mờ bằng cách sử dụng trình đổ bóng phân đoạn trong OpenGL ES 2.0. Thuật toán tôi quan tâm chỉ đơn giản là làm mờ trung bình - thêm tất cả các pixel liền kề vào bản thân và chia cho 9 để chuẩn hóa.Tạo bộ lọc mờ với trình đổ bóng - truy cập các pixel liền kề từ trình đổ bóng phân đoạn?

Tuy nhiên tôi có 2 vấn đề:

1) thực hiện điều này đòi hỏi tôi phải đầu tiên trả cho một bộ đệm khung, sau đó chuyển sang mục tiêu render? Hoặc là có một cách dễ dàng hơn

2) giả sử tôi ràng buộc hình ảnh "nguồn" của tôi để làm mờ như kết cấu 0 và tôi xuất kết cấu mờ của mình. Làm cách nào để truy cập các pixel không phải là pixel mà tôi hiện đang xử lý. Trình đổ bóng tối đã gọi tôi đến điểm ảnh i, nhưng tôi cần truy cập các pixel xung quanh tôi. Làm sao? Và làm thế nào để tôi biết nếu tôi là một trường hợp cạnh (theo nghĩa đen ở cạnh của màn hình)

(3: là có một thuật toán phù hợp hơn để có được một kính mờ mờ nhìn mờ)

Trả lời

11

Xây dựng thêm một chút về những gì Matias nói:

  1. Yes. Bạn làm cho hình ảnh thành một kết cấu (tốt nhất được thực hiện bằng cách sử dụng FBO) và trong lần thứ hai (mờ) vượt qua bạn ràng buộc kết cấu này và đọc từ nó. Bạn không thể thực hiện render và blur đi qua trong một bước, vì bạn không thể truy cập vào framebuffer mà bạn đang render. Điều này sẽ giới thiệu dữ liệu phụ thuộc, như hàng xóm của bạn không cần phải có màu sắc cuối cùng của họ được nêu ra, hoặc tệ hơn có màu sắc phụ thuộc vào bạn.

  2. Bạn nhận được tọa độ pixel hiện nay trong các shader đoạn đặc biệt biến gl_FragCoord và sử dụng các kết cấu như phối vào kết cấu chứa ảnh được dựng trước đó và tương tự gl_FragCoord.x +/- 1gl_FragCoord.y +/- 1 cho những người hàng xóm. Nhưng như Matias đã nói, bạn cần phải chia các giá trị này theo chiều rộng và chiều cao (của hình ảnh) tương ứng, vì tọa độ kết cấu là [0,1]. Bằng cách sử dụng GL_CLAMP_TO_EDGE làm chế độ gói cho kết cấu, các vỏ cạnh được xử lý tự động bằng phần cứng kết cấu. Vì vậy, tại một cạnh bạn vẫn nhận được 9 giá trị, nhưng chỉ có 6 giá trị riêng biệt (3 giá trị khác, những thứ thực sự nằm ngoài hình ảnh, chỉ là bản sao của các hàng xóm bên trong của chúng).

1

1) Có, sử dụng một FBO là con đường để đi.

2) Với toán học, nếu bạn ở điểm ảnh (x, y), thì hàng xóm là (x + 1, y), (x, y + 1), (x + 1, y + 1), (x-1, y), vv Các trường hợp cạnh được xử lý với các chế độ bọc của kết cấu. Lưu ý rằng vì GL_TEXTURE_2D sử dụng tọa độ chuẩn hóa, các offset không phải là 1, mà là 1/width và 1/height của texture.

+1

bạn có thể cụ thể hơn về cách tôi truy cập những người hàng xóm đó từ trong trình đổ bóng phân đoạn không? – Nektarios

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