스텐실 테스트를 통해 몇 개의 프래그먼트를 만들었습니까?


11

스텐실 테스트를 사용하여 불규칙한 모양을 렌더링하는 간단한 2D CSG 와 같은 OpenGL 응용 프로그램이 있습니다. 스텐실 테스트를 통과하고 실제로 렌더링 된 조각 수를 알 수 있다면 일부 계산을 단순화하는 데 매우 유용합니다. 특히 나중에 몬테카를로 시뮬레이션으로 근사화하는 대신 렌더링 된 도형의 영역을 무료로 결정할 수 있습니다.

지오메트리 쉐이더에서 방출 된 프리미티브 ( transform feedback )라고하는 비슷한 개념이 있다는 것을 알고 있습니다. 조각과 스텐실 테스트에 대해 비슷한 개념이 존재하는지 알고 싶습니다.


조잡한 해결책은 스텐실을 통해 대조되는 한 가지 색을 다른 색으로 칠하고 버퍼를 저장하고 변경된 픽셀 수를 세는 것입니다.
TheBuzzSaw

흠, 사양에 따르면 오 클루 전 쿼리깊이 테스트 를 통과 한 조각 수를 계산 하지만 내 머리 꼭대기에서 스텐실 테스트와 어떻게 상호 작용하는지 잘 모르겠습니다.
Chris는 Reinstate Monica가

@ChristianRau 깊이 테스트를 통과 한 조각 만 계산되지만 스텐실, 삭제 및 알파 테스트는 무시됩니다.
Maurice Laveaux

2
원래 ARB_occlusion_query 사양 인 @ChristianRau와 Maurice 는 깊이 스텐실 테스트 를 모두 통과 한 샘플을 계산한다고 명시 적으로 말합니다 . 이 StackOverflow 질문 도 참조하십시오 .
Nathan Reed

@NathanReed 답을 쓰려고하는 것 같습니다.
Chris는 Reinstate Monica가

답변:


10

가능한 방법 중 하나는 하드웨어 폐색 쿼리를 사용하는 것입니다.

사양에 따라 스텐실 테스트는 깊이 테스트 전에 실행되며 깊이 테스트를 통과 한 조각 만 폐색 쿼리에 의해 계산된다는 사실을 사용할 수 있습니다.

테스트되지 않은 간단한 예는 다음과 같습니다.

    GLuint samples_query = 0;
    GLuint samples_passed = 0;
    glGenQueries(1, &samples_query);
    // Initialize your buffers and textures ...
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_STENCIL_TEST);

    // Set up the values on the stencil buffer ...

    // Now we count the fragments that pass the stencil test
    glDepthFunc(GL_ALWAYS); // Set up the depth test to always pass
    glBeginQuery(GL_SAMPLES_PASSED, samples_query);
    // Render your meshes here
    glEndQuery(GL_SAMPLES_PASSED);
    glGetQueryObjectuiv(samples_query, GL_QUERY_RESULT, &samples_passed);
    // samples_passed holds the number of fragments that passed the stencil test (if any)

    // Release your resources ...
    glDeleteQueries(1, &samples_query);

샘플 수를 얻기위한 호출은 파이프 라인의 플러시를 강제로 호출하고 쿼리가 완료 될 때까지 기다립니다. 보다 비동기적인 접근 방식이 필요한 경우 다음을 사용하여 오 클루 전 쿼리가 수행되는지 여부를 쿼리 할 수 ​​있습니다.

    GLuint query_done = 0;
    glGetQueryObjectuiv(samples_query, GL_QUERY_RESULT_AVAILABLE, &query_done);
    if (query_done != 0)
        // Your query result is ready
    else
        // Maybe check the next frame?

2

관심있는 부분이 영역 인 경우 한 픽셀에 도달 할 때까지 스텐실 버퍼의 크기를 줄이고 해당 영역을 해당 색상에서 추론 할 수 있습니다.

단계는 다음과 같습니다.

  • 충분한 정밀도를 가진 형식을 사용하여 스텐실을 텍스처에 복사하십시오.
  • 주어진 색상의 텍셀 수에 비례하여 색상을 출력하는 셰이더를로드합니다.
  • 한 픽셀에 도달 할 때까지 크기를 절반으로 줄이기 위해 프레임 버퍼 사이의 핑퐁.
  • 픽셀의 색상은 해당 영역으로 덮인 뷰포트의 백분율입니다. 뷰포트의 영역에 곱하면됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.