2010-03-11 35 views
30
void main(void) 
{ 
    vec4 clipCoord = glModelViewProjectionmatrix * gl_Vertex; 
    gl_Position = clipCoord; 

    gl_FrontColor = gl_Color; 

    vec3 ndc = clipCoord.xyz/clipCoord.w; 

Vì vậy, clipCoord chỉ thực hiện các biến đổi đường ống cố định tiêu chuẩn. Tại sao tôi chia cho w và tôi nhận được gì từ điều này?Trong trình đổ bóng đỉnh OpenGL, w là gì và tại sao tôi chia nó?

Trả lời

35

W là tọa độ thứ tư của một đỉnh ba chiều; Đỉnh này được gọi là tọa độ đỉnh đồng nhất.

Trong một vài từ, thành phần W là yếu tố chia các thành phần vectơ khác. Khi W là 1.0, các tọa độ đỉnh đồng nhất là "chuẩn hóa". Để so sánh hai đỉnh, bạn nên chuẩn hóa giá trị W thành 1.0.

Nghĩ đến đỉnh (1,1,1,1). Bây giờ tăng giá trị W (w> 1.0). Các vị trí bình thường được mở rộng quy mô! và nó sẽ xuất phát. Nghĩ đến đỉnh (1,1,1,1). Bây giờ hãy giảm giá trị W (W < 1.0). Vị trí chuẩn hóa sẽ đi đến một điểm vô hạn.

Ngoài việc chia tỷ lệ tọa độ đỉnh, tọa độ W là cần thiết vì bạn phải nhân ma trận 4x4 (chế độ xem mô hình và/hoặc ma trận chiếu) với ma trận 4x1 (đỉnh).

Tất nhiên, Sổ đỏ là hướng dẫn rõ ràng:

Red Book Appendix

+7

tại sao avlue này từng được không 1? – anon

+4

@anon: trong ngắn hạn, bởi vì ma trận chiếu thay đổi giá trị của nó. Nhìn vào Phụ lục Luca đang chỉ vào, ở phần dưới cùng. một phép chiếu điển hình làm w_out = -z_in. Đó là lý do tại sao mọi người đôi khi gọi đây là "phân chia phối cảnh". – Bahbar

+5

@anon, từ [chủ đề này] (http://www.opengl.org/discussion_boards/showthread.php/170202-GLSL-Why-is-gl_Vertex-a-vec4) có hai giá trị chung, w = 1 cho một ** điểm ** và w = 0 cho ** vectơ **. – Air

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