Câu trả lời:
Chúng bổ sung nhiều hơn thay thế cho nhau. Bạn hầu như luôn muốn đặt hình chữ nhật cắt kéo thành các giá trị giống như chế độ xem.
glViewport () chỉ định chuyển đổi từ không gian chiếu chuẩn hóa sang không gian màn hình. Đa giác được cắt vào cạnh của không gian chiếu, nhưng các hoạt động vẽ khác như glClear () thì không. Vì vậy, bạn sử dụng glViewport () để xác định vị trí và kích thước của vùng chế độ xem không gian màn hình, nhưng trình raster vẫn có thể thỉnh thoảng hiển thị các pixel bên ngoài vùng đó.
Đó là nơi mà hình cắt kéo xuất hiện. GlScissor () định nghĩa một hình chữ nhật không gian màn hình mà không có gì được vẽ (nếu thử nghiệm cắt kéo được bật).
Vì vậy, ví dụ, đoạn mã sau sẽ xóa toàn bộ màn hình, mặc dù chế độ xem được đặt thành một phần nhỏ của cửa sổ lớn hơn:
glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);
Thêm glScissor () và cho phép kiểm tra cắt kéo (được tắt theo mặc định) sẽ hạn chế xóa.
glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);
Đôi khi bạn bắt gặp một triển khai tự động kéo đến vùng chế độ xem, nhưng điều đó vi phạm đặc tả GL.
Ngoài ra, hình chữ nhật cắt kéo có thể được sử dụng để tạm thời hạn chế vẽ vào hình chữ nhật phụ của chế độ xem, cho các hiệu ứng đặc biệt, các thành phần UI, v.v.
Chúng hoạt động ở hai phần hoàn toàn khác nhau của đường ống đồ họa.
glViewport thực sự chỉ định một phép biến đổi và đó là một phép biến đổi xảy ra sau trình đổ bóng đỉnh nhưng trước trình tạo bóng mảnh. Nếu nó giúp xem vị trí của nó phù hợp về mặt khái niệm, hãy nghĩ rằng nó là một phần của các phép biến đổi được sử dụng để đưa dữ liệu đỉnh của bạn từ không gian thế giới sang không gian màn hình (nghĩa là nó tương đối gần với mô hình và phép chiếu).
Kiểm tra cắt kéo xảy ra sau khi đổ bóng mảnh, cùng với tất cả các hoạt động phân mảnh khác xảy ra tại thời điểm đó, chẳng hạn như trộn, độ sâu / stprint, v.v. Khi một đoạn được kiểm tra bằng thử nghiệm cắt kéo, do đó nó đã được thực hiện chuyển đổi khung nhìn.
Có, kiểm tra cắt kéo có thể nhanh hơn có thể stprint vì đó là chấp nhận / từ chối đơn giản dựa trên các coords không gian màn hình của một đoạn, trong khi stprint cần so sánh với giá trị hiện tại trong bộ đệm stpson, có thể tăng hoặc giảm giá trị hiện tại, cũng có tính đến kết quả kiểm tra độ sâu, v.v.
Vì vậy, đặt tất cả những thứ đó lại với nhau, bạn có thể thấy tại sao bài kiểm tra cắt kéo tồn tại. Nó cung cấp cho bạn khả năng giới hạn các phân đoạn trên một phần hình chữ nhật của màn hình, nhưng không thực sự sửa đổi biến đổi chế độ xem hiện tại.
Tôi thích loại điều này giải thích trực quan.
Trong OnpenGL, chúng ta có tọa độ 2D đi từ -1 đến +1 cho cả trục X và Y.
Sau đó, hình ảnh này cần phải được ánh xạ đến tọa độ cửa sổ.
Chúng ta hãy tưởng tượng rằng chúng ta có cửa sổ có màu tối như mặt đất và chúng ta có màu trắng là màu rõ ràng.
Trường hợp phổ biến nhất là có khung nhìn và hình cắt kéo bao phủ toàn bộ màn hình.
Nhưng chúng ta có thể đặt chúng thành một vùng nhỏ hơn trên màn hình.
Những vùng này có thể khác nhau. Trong ví dụ sau, khung nhìn bao phủ toàn bộ màn hình, trong khi hình cắt kéo là hộp nhỏ hơn.
Và trong trường hợp cuối cùng này, hình cắt kéo bao phủ toàn bộ màn hình, trong khi khung nhìn là hộp nhỏ hơn. Lưu ý rằng glClear
ảnh hưởng đến toàn bộ màn hình, vì điều đó được xác định bởi vùng cắt kéo.
glSc khoa hoàn thành việc cắt hình học trên một phần của màn hình.
Bạn sẽ muốn điều này, ví dụ, nếu bạn đang hiển thị một hộp GUI có cuộn văn bản trơn tru bên trong nó. Bạn muốn cắt tất cả hình học bên ngoài phần màn hình được GUI bao phủ, nhưng giữ một phần văn bản hoặc đa giác vẫn còn bên trong.
glViewport ánh xạ tọa độ chiếu sang tọa độ thiết bị, nhưng không cắt.
glStpson được sử dụng để che các pixel riêng lẻ trong các mẫu phức tạp hơn, chẳng hạn như hình dạng không đều. Do đó, glScatu nhanh hơn.
glScissor đơn giản hơn các phép biến đổi chiếu với khung nhìn.
Kiểm tra glScissor chỉ định những pixel nào sẽ được thay đổi khi kết xuất, trong khi glViewport thay đổi cách gl nên ánh xạ từ tọa độ thiết bị sang tọa độ cửa sổ.
Sau đó, sự khác biệt với việc đặt chế độ xem thành hình chữ nhật bạn muốn kết xuất và điều chỉnh ma trận chiếu để hoàn tác tỷ lệ được thực hiện bởi chế độ xem.
Viewport
clip tính toán đỉnh. Nếu bạn vẽ một đường có độ dày đường> 1 hoặc một điểm cógl_PointSize
> 1, bạn cũng sẽ vẽ bên ngoài khung nhìn.