glScissor의 목적은 무엇입니까?


32

스텐실 테스트보다 효율적이라는 것을 알고 있지만 뷰포트로 투영 변환을 사용하여 동일한 기능을 수행 할 수 있다고 가정합니까?

답변:


46

그것들은 서로의 대안보다 보완 적입니다. 거의 항상 가위 직사각형을 뷰포트와 동일한 값으로 설정하려고합니다.

glViewport ()는 표준화 된 투영 공간에서 스크린 공간으로의 변환을 지정합니다. 다각형은 투영 공간의 가장자리에 클리핑되지만 glClear ()와 같은 다른 그리기 작업은 그렇지 않습니다. 따라서 glViewport ()를 사용하여 화면 공간 뷰포트 영역의 위치와 크기를 결정하지만 래스터 라이저는 여전히 해당 영역 외부의 픽셀을 렌더링 할 수 있습니다.

그것이 scissor in이 들어오는 곳입니다. glScissor ()는 아무것도 그려 지지 않는 화면 공간 사각형을 정의합니다 (가위 테스트가 활성화 된 경우).

예를 들어, 뷰포트가 큰 창의 작은 부분으로 설정되어 있어도 다음 코드는 전체 화면을 지 웁니다.

glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

glScissor ()를 추가하고 scissor test (기본적으로 비활성화되어 있음)를 활성화하면 클리어가 제한됩니다.

glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

때때로 자동으로 뷰포트 영역으로 가지만 GL 사양을 위반하는 구현을 보게됩니다.

그 외에도 가위 사각형을 사용하여 특수 효과, UI 요소 등을 위해 그리기를 뷰포트의 하위 사각형으로 일시적으로 제한 할 수 있습니다.


11
더 명확하게 Viewport정점 계산을 클립합니다. 선 두께가 1보다 큰 선을 그리거나> 1이있는 점을 gl_PointSize그리면 뷰포트 외부에도 그릴 수 있습니다.
gman

13

그래픽 파이프 라인에서 완전히 다른 두 부분에서 작동합니다.

glViewport는 실제로 변형을 지정하며 이는 정점 셰이더 이후이지만 조각 셰이더 이전에 발생하는 변형입니다. 그것이 개념적으로 어느 부분에 적합한 지 알아내는 데 도움이된다면, 월드 공간에서 스크린 공간으로 버텍스 데이터를 얻는 데 사용되는 변환의 일부라고 생각하십시오 (즉, 모델 뷰 및 투영과 상대적으로 밀접한 관련이 있습니다).

시저 테스트는 블렌딩, 깊이 / 스텐실 등과 같이 그 당시에 발생하는 다른 모든 조각 별 작업과 함께 프래그먼트 셰이더 이후에 발생합니다. 따라서 가위 테스트로 프래그먼트를 테스트 할 때는 이미 뷰포트 변환

예, 가위 테스트는 조각의 화면 공간 좌표를 기반으로하는 간단한 수락 / 거부이기 때문에 스텐실 수 있습니다. 스텐실은 스텐실 버퍼의 현재 값과 비교해야하며, 현재 값을 늘리거나 줄일 수도 있습니다. 수심 테스트 결과 등.

따라서이 모든 것을 종합하면 시저 테스트가 왜 존재하는지 알 수 있습니다. 조각 별 작업을 화면의 직사각형 부분으로 제한 할 수 있지만 현재 뷰포트 변환을 실제로 수정하지 않아도됩니다.


6

나는 시각적으로 설명 된 이런 종류의 것을 좋아한다.

OnpenGL에는 X 축과 Y 축 모두에 대해 -1에서 +1로가는 2D 좌표가 있습니다.

여기에 이미지 설명을 입력하십시오

그런 다음이 이미지를 창 좌표에 매핑해야합니다.

우리는 배경이 짙은 색의 창을 가지고 있고 맑은 색으로 흰색을 가지고 있다고 상상해 봅시다.

가장 일반적인 경우는 뷰포트와 가위로 전체 화면을 덮는 것입니다.

여기에 이미지 설명을 입력하십시오

그러나 화면의 작은 영역으로 설정할 수 있습니다.

여기에 이미지 설명을 입력하십시오

이 지역은 다를 수 있습니다. 다음 예제에서는 뷰포트가 전체 화면을 덮고 가위는 작은 상자입니다.

여기에 이미지 설명을 입력하십시오

마지막 경우에는 가위가 전체 화면을 덮고 뷰포트는 더 작은 상자입니다. glClear가위 영역에 의해 결정되므로 전체 화면에 영향 을 줍니다.

여기에 이미지 설명을 입력하십시오


1
이것은 나에게 가장 명확한 설명이며, 실제로 그림이 필요했습니다.
Laurent Caillette

5

glScissors는 화면 일부에 대해 지오메트리 클리핑을 수행합니다.

예를 들어, 텍스트가 부드럽게 스크롤되는 GUI 상자를 렌더링하는 경우이 방법을 원할 것입니다. GUI로 덮힌 화면 부분 바깥의 모든 지오메트리를 자르고 싶지만 여전히 내부에있는 부분 텍스트 나 다각형은 유지하십시오.

glViewport는 투영 좌표를 장치 좌표에 매핑하지만 클리핑하지는 않습니다.

glStencil은 불규칙한 모양과 같은보다 복잡한 패턴으로 개별 픽셀을 마스크하는 데 사용됩니다. 따라서 glScissors가 더 빠릅니다.


1

glScissor는 뷰포트를 사용한 투영 변환보다 더 간단합니다.

glScissor 테스트는 렌더링시 변경할 픽셀을 지정하고 glViewport는 gl이 장치 좌표에서 창 좌표로 gl을 매핑하는 방법을 변경합니다.

그런 다음 뷰포트를 렌더링하려는 사각형으로 설정하고 투영 매트릭스를 조정하여 뷰포트에서 수행 한 스케일링을 취소하는 것과의 차이점은 무엇입니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.