프래그먼트 셰이더에게 특정 픽셀을 쓰지 않도록 지시하려면 어떻게해야합니까?


11

WebGL에서 조각 쉐이더로 처리되는 화면 공간 쿼드를 보내려고하지만 조각 쉐이더가 특정 조건 (예 : 원 안에 있거나 픽셀은 곡선 방정식 또는 무언가에 의해 정의 된 반 공간의 양의 측면에 속합니다.

프래그먼트 셰이더 내에서 "픽셀을 쓰지 마십시오"라고 말할 수 있습니까?

알파 블렌딩, 이것을 먼저 렌더링하고 픽셀을 그리고 싶지 않은 곳에 배경색을 넣거나 깊이 또는 스텐실 버퍼로 트릭을 수행하는 것과 같은 다양한 다른 방법을 사용하여 이것이 가능하다는 것을 알고 있습니다. 또한 렌더링하려는 것과 일치하는 형상을 만들 수 있다는 것도 알고 있습니다.

프래그먼트 셰이더가 픽셀을 전혀 쓰지 않도록 선택하는 방법이 있습니까?

답변:


10

예, discard조각 쉐이더에서 픽셀을 쓰지 않도록 할 수 있습니다 . 다음 은 Google에서 발굴 한 임의의 예 입니다.

GPU가 조각의 조각을 처리하는 경향이 있기 때문에 조각 쉐이더의 처리가 실제로 중단되지는 않을 수 있습니다. 블록의 모든 조각에서 삭제하면 처리가 중단됩니다. 그러나 프래그먼트는 기본적으로 원하는 출력에 기록되지 않습니다.

SO 의 성능discard이것 에 관한 이 관련 질문에 관심이있을 수 있습니다 .

그래도 이것이 WebGL에서 지원되는지 모르겠습니다. 그렇지 않다면 알파 블렌딩과 같은 제안 중 하나로 넘어 가야합니다. 나는 그것이 가장 간단하다고 생각합니다.


3

discard문 유용합니다.

의사 결정 경로에 대해 너무 많이 말하지 않았으므로 간단한 텍스처 조회를 사용하는 예제를 제공합니다.

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(알파 블렌딩에 대해 배우기 전에 작성한 샘플 코드에서 얻은 것입니다.)

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