Mục đích của glScissor là gì?


32

Tôi biết rằng nó hiệu quả hơn so với thử nghiệm stpson, nhưng tôi có đúng không khi cho rằng chức năng tương tự có thể đạt được bằng cách sử dụng các phép biến đổi chiếu với khung nhìn?

Câu trả lời:


46

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.


11
để rõ ràng hơn, Viewportclip 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.
gman

13

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.


6

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.

nhập mô tả hình ảnh ở đâ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ập mô tả hình ảnh ở đây

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ập mô tả hình ảnh ở đây

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.

nhập mô tả hình ảnh ở đây

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.

nhập mô tả hình ảnh ở đây


1
Đây là lời giải thích rõ ràng nhất cho tôi, nó thực sự cần bản vẽ.
Laurent Caillette

5

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.


1

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.

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.