문제

OpenGL.XOR을 사용하여 하나의 이미지를 그린 다음 두 번째 이미지를 그렸다고 가정해 보겠습니다.이제 어딘가에 검정색이 아닌 픽셀이 있는 검정색 버퍼가 있습니다. 셰이더를 사용하여 GPU에서 검정색 [ rgb(0,0,0) ] 픽셀을 계산할 수 있다는 내용을 읽었습니다.

나는 또한 OcclusionQuery로 뭔가를 해야 한다는 것을 읽었습니다.http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

가능하며 방법은 무엇입니까?[모든 프로그래밍 언어]

OpenGL/GPU를 통해 유사성을 찾는 방법에 대한 다른 아이디어가 있다면 그것도 좋을 것입니다.

도움이 되었습니까?

해결책

XOR 비트를 어떻게 수행하는지 잘 모르겠습니다(적어도 속도는 느려야 합니다.현재 GPU에서는 이를 가속화할 수 없다고 생각합니다. 하지만 제 생각은 다음과 같습니다.

  1. 두 개의 입력 이미지가 있습니다
  2. 폐색 쿼리를 켭니다.
  3. 두 개의 이미지를 화면에 그립니다(예:두 개의 텍스처가 설정된 전체 화면 쿼드), abs(texel1-texel2)를 계산하고 픽셀(버리다 GLSL에서) 픽셀이 똑같다 (차이는 0이거나 일부 임계값보다 낮습니다).가장 쉬운 방법은 아마도 GLSL 프래그먼트 셰이더를 사용하는 것입니다. 거기서 두 개의 텍스처를 읽고 차이에 대한 abs()를 계산하고 픽셀을 버립니다.여기서는 매우 기본적인 GLSL 지식이면 충분합니다.
  4. 쿼리를 통과한 픽셀 수를 가져옵니다.동일한 픽셀의 경우 쿼리가 통과되지 않으며(픽셀은 셰이더에 의해 삭제됨), 다른 픽셀의 경우 쿼리가 통과됩니다.

처음에는 깊이 버퍼와 관련된 더 복잡한 접근 방식을 생각했지만 픽셀을 죽이는 것만으로도 충분하다는 것을 깨달았습니다.내 원본은 다음과 같습니다(그러나 위의 것이 더 간단하고 효율적입니다).

  1. 두 개의 입력 이미지가 있습니다
  2. 깨끗한 화면과 깊이 버퍼
  3. 두 개의 이미지를 화면에 그립니다(예:두 개의 텍스처가 설정된 전체 화면 쿼드), abs(texel1-texel2)를 계산하고 픽셀(버리다 GLSL에서) 픽셀이 다른 경우.깊이 버퍼 값이 평면에 가까운 값이 되도록 쿼드를 그립니다.
  4. 이 단계 후에 깊이 버퍼에는 동일한 픽셀에 대한 작은 깊이 값과 다른 픽셀에 대한 큰(원거리 평면) 깊이 값이 포함됩니다.
  5. 폐색 쿼리를 켜고 깊이가 원거리 평면보다 가깝지만 이전 쿼드보다 큰 또 다른 전체 화면 쿼드를 그립니다.
  6. 쿼리를 통과한 픽셀 수를 가져옵니다.동일한 픽셀의 경우 쿼리가 통과하지 못하고(깊이 버퍼가 이미 더 가까워짐) 다른 픽셀의 경우 쿼리가 통과됩니다.이를 얻으려면 SAMPLES_PASSED_ARB를 사용합니다.다음 위치에 폐색 쿼리 예제가 있습니다. CodeSampler.com 시작하려면.

물론 이 모든 작업에는 폐색 쿼리를 지원하는 GPU가 필요합니다.2002년 이후 대부분의 GPU는 일부 저가형 GPU(특히 Intel 915(일명 GMA 900) 및 Intel 945(일명 GMA 950))를 제외하고 이를 지원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top