2008-09-19 5 views
2

OpenGL. XOR을 사용하여 하나의 이미지를 그린 다음 두 번째 이미지를 그린다고 가정 해 보겠습니다. 이제 어딘가에 검정색 픽셀이없는 검은 색 버퍼가 생겼습니다. GPU에서 검정색 [rgb (0,0,0)] 픽셀을 계산하기 위해 쉐이더를 사용할 수 있다는 것을 읽었습니다.GPU에서 이미지 유사성 계산 [OpenGL/OcclusionQuery]

또한 OcclusionQuery와 관련이 있다는 것을 읽었습니다. http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

가능한가요? [모든 프로그래밍 언어]

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

답변

2

나는 당신이 (적어도 그것을 천천히해야한다, 나는 현재의 GPU의가 가속화 생각하지 않는다)를 XOR 비트를 어떻게 잘 모르겠지만, 여기 내 생각 :

  1. 는 두 개의 입력을 가지고 이미지
  2. 오 클루 전 쿼리를 켭니다.
  3. abs (texel1-texel2)를 계산하는 프래그먼트 셰이더를 사용하여 화면에 두 개의 이미지 (두 개의 텍스처가 설정된 전체 화면 쿼드)를 그려야하며 픽셀이 (예 : GLSL의 경우 discard) 동일 (차이가 0 이하이거나 특정 임계 값 미만). 가장 쉬운 방법은 아마도 GLSL 조각 셰이더를 사용하는 것일뿐입니다. 두 텍스처를 읽고 abs()를 계산하여 픽셀을 버리면됩니다. 아주 기본적인 GLSL 지식으로 충분합니다.
  4. 쿼리를 통과 한 픽셀 수를 가져옵니다. 동일한 픽셀의 경우 쿼리가 통과하지 않고 (픽셀은 셰이더에서 무시됩니다), 다른 픽셀의 경우 쿼리가 전달됩니다.

처음에는 깊이 버퍼가 포함 된 더 복잡한 접근 방법을 사용했지만 픽셀을 죽이는 것으로 충분하다는 것을 알았습니다. 여기에 내 원래 생각이다 (그러나 위의 사람은 더 간단하고 효율적이다) :

  1. 화면 (즉, 전체 화면 쿼드로에 두 개의 입력 영상
  2. 명확 화면과 깊이 버퍼
  3. 두 이미지를 그릴 수있다 두 개의 텍스처가 설정 됨), abs (texel1-texel2)를 계산하고 픽셀이 다른 경우 GWL에서 discard을 삭제하는 조각 쉐이더가 있습니다. 쿼드를 그려서 깊이 버퍼 값이 평면 근처에있는 값이되도록합니다.
  4. 이 단계 이후에 깊이 버퍼에는 동일한 픽셀의 작은 깊이 값과 다른 픽셀의 큰 (먼 평면) 깊이 값이 포함됩니다.
  5. 오 클루 전 쿼리를 켜고 깊이가 원거리보다 가깝지만 이전 쿼드보다 큰 다른 전체 화면 쿼드를 그립니다.
  6. 쿼리를 통과 한 픽셀 수를 가져옵니다. 동일한 픽셀의 경우 쿼리가 통과하지 않고 (깊이 버퍼가 이미 가까이 있음), 다른 픽셀의 경우 쿼리가 통과합니다. 이를 얻으려면 SAMPLES_PASSED_ARB를 (를) 사용하십시오. 시작을 위해 CodeSampler.com에 교합 쿼리 예가 있습니다.

물론이 모든 것은 교합 쿼리 지원이있는 GPU를 필요로합니다. 2002 년 이후로 대부분의 GPU는 일부 저가형 프로세서 (특히 Intel 915 (일명 GMA 900) 및 Intel 945 (일명 GMA 950) 제외)를 지원합니다.

+0

글쎄, 네, 그게 제가 생각한 것입니다,하지만 웹에 코드 예제가 있습니까? 특히 "abs (texel1-texel2)"및 "쿼리를 통과 한 픽셀 수"를 계산합니다. –

+0

@yoihj : 이것은 매우 기본적인 GLSL 및 폐색 쿼리 사용법입니다. GLSL 튜토리얼을 찾아보고 occlusion 쿼리 샘플에 대한 링크를 추가했습니다. – NeARAZ