2012-04-30 26 views

Trả lời

12

Thông số GLSL và OpenGL không cần thiết gây nhầm lẫn về vấn đề này. Đặc tả OpenGL dễ hiểu hơn: gl_FragCoord lưu trữ các thành phần X, Y và Z của vị trí đỉnh không gian cửa sổ. Các giá trị X, Y và Z được tính toán như được mô tả để tính toán vị trí không gian cửa sổ (mặc dù điểm ảnh trung tâm và phần trên bên trái có thể sửa đổi các giá trị X và Y). Điều này được mô tả trong phần Coordinate Transforms của thông số kỹ thuật.

Thành phần W gl_FragCoord là (1/W c), nơi W cclip-không gian đỉnh vị trí. Đó là gl_Position.w từ trình đổ bóng đỉnh của bạn.

Mục đích hữu ích duy nhất để giữ W c xung quanh là reverse-transform gl_FragCoord để lấy lại vị trí không gian clip. Trong đó, như trang đó hiển thị, yêu cầu nhân với W c. Nhưng kể từ khi gl_FragCoord chỉ lưu trữ nghịch đảo của giá trị này, bây giờ nó đòi hỏi phải chia cho gl_FragCoord.w. Vì vậy, chúng ta có thể giả định rằng OpenGL lưu trữ nó theo cách này bởi vì OpenGL không được phép tạo ra quá nhiều ý nghĩa;) Xem đấy, đó là một quy tắc mà mọi phần của đặc tả OpenGL phải có thứ gì đó vô nghĩa. Các thành phần XYZ có ý nghĩa quá nhiều, do đó, họ quyết định để nó lưu trữ nghịch đảo của giá trị bạn thực sự muốn.

OK, về mặt kỹ thuật đây là một tạo tác lịch sử từ những ngày 3D Labs tạo GLSL. Tôi chắc chắn rằng họ đã làm nó vì lý do phần cứng hoàn toàn ích kỷ, nhưng tôi không có bằng chứng thực sự về điều đó.

2

Một tọa độ đồng nhất được cho bởi: (x, y, z, w), mà dự án để: (x/w, y/w, z/w). gl_FragCoord lưu trữ dự báo này, nhưng thay vì lưu trữ (vô dụng) (w/w) = (1) cho thành phần cuối cùng, nó lưu trữ (1/w), để giữ lại thông tin hữu ích.

+1

"' gl_FragCoord' lưu trữ phép chiếu này "Không, nó lưu trữ biến đổi chiếu sau đó thành không gian cửa sổ. –

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