Tại sao chúng ta cần tọa độ thứ tư để chia cho z?


12

Tôi đọc phản hồi ở đây:

Card đồ họa làm gì với phần tử thứ tư của vectơ làm vị trí cuối cùng?

"Thành phần thứ tư là một mẹo để theo dõi phép chiếu phối cảnh. Khi bạn thực hiện phép chiếu phối cảnh, bạn muốn chia cho z: x '= x / z, y' = y / z, nhưng đây không phải là một hoạt động mà có thể được thực hiện bởi ma trận 3x3 hoạt động trên một vectơ x, y, z. Thủ thuật đã trở thành tiêu chuẩn để thực hiện điều này là nối thêm tọa độ thứ tư, w và tuyên bố rằng x, y, z sẽ luôn được chia cho w sau khi tất cả các biến đổi được áp dụng và trước khi rasterization. "

nhưng tôi không hiểu tại sao chúng ta không thể chia cho z bằng ma trận 3x3?

chúng ta không thể nhân lên

1/z 0 0
0 1/z 0
0 0 1/z

để có được [x/z y/z 1]

?


Cố gắng diễn đạt một phép biến đổi (hoặc thành phần của các phép biến đổi) bao gồm dịch ở đâu đó trong chuỗi. Không có giá trị aw, bạn không thể biểu thị nó trong một ma trận.
DMGregory

Tôi hiểu phần dịch thuật nhưng tôi không hiểu cách thêm tọa độ thứ tư sẽ giúp ích hay là một mẹo để chia cho z

Đối với những gì nó có giá trị bạn hoàn toàn có thể làm những gì bạn nói. Chia x và y theo z là phương pháp hợp lệ để chuyển đổi từ tọa độ 3d sang không gian màn hình 2d với phép chiếu trong đó các đối tượng ở xa trở nên nhỏ hơn. W là tọa độ đồng nhất để đưa nó lên chiều thứ tư để có thể thực hiện dịch.
Alan Wolfe

Câu trả lời:


14

Bởi vì nếu bạn chỉ chia [x, y, z]cho zbạn nhận được [x/z, y/z, 1]và bạn mất giá trị thực tế z, điều này thực sự hữu ích nếu bạn muốn thực hiện cắt mặt phẳng gần / xa hoặc điền vào bộ đệm Z.

Do đó, cách tốt nhất để giữ một số thông tin về zGPU, là sử dụng 4 thành phần thay vì 3. Trong thực tế, những gì thực sự có trong hai thành phần vector cuối cùng trước khi phân chia phối cảnh phụ thuộc vào loại hình chiếu và hiệu ứng của bạn muốn

Ví dụ, trong trường hợp chiếu hình phối cảnh, đây là vectơ 4 thành phần kết quả:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

Sau khi phối cảnh chia vector trở thành:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

c + d/zphần này cho chúng ta đủ thông tin để điền vào bộ đệm Z.


Bạn chỉ có thể chia X và Y cho Z, thu được [x / z, y / z, z]. GPU không để làm bộ phận vector, nó có thể đã được thiết kế để làm bất kỳ tính toán.
dùng253751

3

Về mặt kỹ thuật, bạn có thể làm điều đó. Nhưng tại sao phải bận tâm? Vào thời điểm bạn có trận chung kết đó z, bạn có thể:

  • xây dựng một ma trận 3x3 như bạn đã mô tả, lãng phí 9 * sizeof(float)byte không gian, dành chu kỳ để tính toán 1/z(một bộ phận) và sau đó thực hiện chín bội số và sáu lần thêm để có được đỉnh cuối cùng của bạn, hoặc
  • bạn có thể làm ba bộ phận, như các đường ống hiện đại hiện đang làm

Một trong những thứ này có vẻ tối ưu hơn nhiều đối với tôi, và nó không phải là cái đầu tiên. Ngay cả khi phần cứng được tối ưu hóa tồn tại cho ma trận nhân lên, như chắc chắn là như vậy, nó vẫn phức tạp về mặt khái niệm hơn là một phân chia đơn giản.

Thêm vào đó, một ma trận 3x3 không thể mã hóa một bản dịch, và do đó, một ma trận 4x4 (và do đó thứ tư wphối hợp) được sử dụng trước đó trong đường ống dẫn nào . Điều này có nghĩa là bạn đã có thành phần thứ tư ngồi ở đó để bạn cũng có thể sử dụng nó để vận chuyển một giá trị hữu ích và thực hiện phân chia của bạn với nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.