2011-08-23 18 views
6

Hãy sửa tôi nếu tôi sai. Khi sử dụng các pixel đổ bóng và pixel, chúng tôi thường cung cấp mã để tính toán độ lệch đầu ra của trình đổ bóng đỉnh. Sau đó, chúng ta tìm thấy những con ouselves với gl_FragCoord đầu vào trong trình đổ bóng pixel. Tên của các hoạt động được thực hiện bởi OpenGL để tính toán gl_FragCoord từ gl_position là gì? Có đúng là những "chiếu" và "clip tọa độ biến đổi" không? Sau đó, những biến đổi chính xác thực hiện trong các hoạt động đó là gì? Nói cách khác, quan hệ toán học giữa gl_FragCoord và gl_position là gì, tôi có thể sử dụng hàm này để thay thế hàm openGL?Trong glsl, công thức được sử dụng để tính toán gl_fragCoord từ gl_position là gì?

Cảm ơn bạn rất nhiều vì mọi đóng góp.

+0

Tôi đã có cùng một vấn đề và câu hỏi một lúc trước và đã tự trả lời trong câu hỏi "OpenGL: Tính toán phối hợp không gian mắt từ phối hợp không gian cửa sổ trong GLSL?", Bạn có thể tìm thấy liên kết ở bên phải. – karx11erx

+0

Xin lỗi karx11erx, đây không phải là điều tôi muốn. Thực ra, tôi nghĩ điều tôi muốn là ngược lại. Tôi không muốn "unproject", tôi muốn chiếu tọa độ 3d của tôi vào tọa độ màn hình 2d. – wil

+0

Bạn cũng có thể xem cách thực hiện điều đó ở đó, vì trình đổ bóng đầu tiên không dự án (từ không gian xem ánh sáng) và sau đó là dự án (không gian màn hình trình xem). – karx11erx

Trả lời

9

gl_Position nằm trong tọa độ đồng nhất sau chiếu.

Nó đáng chú ý là gl_Position là (4d) vị trí của một đỉnh, trong khi gl_FragCoord là (2d) vị trí của một đoạn.

Các hoạt động đó xảy ra ở giữa là

  1. lắp ráp nguyên thủy (để tạo ra một hình tam giác từ 3 đỉnh, ví dụ)
  2. clipping (tức là cắt hình tam giác trong nhiều tam giác đó là tất cả ở bên trong xem, nếu nó không phù hợp với ban đầu)
  3. ứng dụng viewport
  4. rasterization (lấy những hình tam giác và tạo ra mảnh vỡ có mái che từ họ)

Vì vậy, trong khi bạn có thể tìm công thức để chuyển đổi điểm tùy ý được biểu diễn từ vị trí đỉnh trong không gian 2d là khung nhìn, nó không ở trong và của chính nó hữu ích, vì các đoạn được tạo không thẳng hàng với vị trí đỉnh. công thức để có tọa độ 2d của đỉnh là

2d_coord_vertex = viewport.xy + viewport.wh * (1 + gl_Position.xy/gl_Position.w)/2 

Một lần nữa, đây không phải là gl_FragCoord. Kiểm tra các chi tiết về rasterization trong đặc điểm kỹ thuật GL nếu bạn muốn có kiến ​​thức chuyên sâu hơn.

Tôi không chắc chắn chính xác ý bạn là gì "thay thế hàm openGL", nhưng việc rasterizing là không tầm thường và vượt quá phạm vi của câu trả lời SO.

+0

Cảm ơn bạn đã trả lời. Mục đích của tôi là thực hiện một shader ánh sáng bóng bản đồ. Tôi đã tạo một bản đồ độ sâu (bản đồ bóng) bằng cách hiển thị cảnh từ vị trí ánh sáng (sử dụng "ma trận chiếu"), tuy nhiên khi hiển thị các đỉnh của cảnh cuối cùng, tôi không biết tọa độ nào sẽ sử dụng để lấy dữ liệu bóng từ bản đồ . Tôi nghĩ tôi có thể sử dụng "ma trận chiếu" của ánh sáng để lấy giá trị là gl_position khi tôi tạo bản đồ bóng, và sau đó tính giá trị gl_fragCoord khi tôi tạo bản đồ bóng, để lấy dữ liệu bóng ở đúng vị trí. Nó có thể hoạt động không? – wil

+0

@wil: cách điển hình để thực hiện điều đó là vượt qua một thế giới hoặc xem vị trí không gian cùng với gl_Position (trong một đầu ra khác) cho trình đổ bóng phân đoạn. Bằng cách đó, trong shader fragment, vị trí nội suy chính xác (trong khung nhìn hoặc không gian thế giới, tùy thuộc vào những gì bạn đã vượt qua), có thể được biến đổi bởi một ma trận để đưa nó trở lại không gian ánh sáng. Câu trả lời ngắn gọn là, đừng dựa vào gl_FragCoord, vượt qua những gì bạn cần. – Bahbar

+0

Tôi không chắc chắn chính xác những gì bạn đang theo dõi, nhưng nó không có vẻ giống như tính toán bản đồ bóng tối. Đó là những gì tôi đã đề cập đến, và âm thanh khác biệt đáng kể với điều của riêng bạn. Tôi khuyên bạn nên mở một câu hỏi mới, với một số thông tin chi tiết về _what_ bạn đang cố gắng giải quyết – Bahbar