GPU에서 이미지 유사성 계산 [OpenGL/OcclusionQuery]
문제
OpenGL.XOR을 사용하여 하나의 이미지를 그린 다음 두 번째 이미지를 그렸다고 가정해 보겠습니다.이제 어딘가에 검정색이 아닌 픽셀이 있는 검정색 버퍼가 있습니다. 셰이더를 사용하여 GPU에서 검정색 [ rgb(0,0,0) ] 픽셀을 계산할 수 있다는 내용을 읽었습니다.
나는 또한 OcclusionQuery로 뭔가를 해야 한다는 것을 읽었습니다.http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
가능하며 방법은 무엇입니까?[모든 프로그래밍 언어]
OpenGL/GPU를 통해 유사성을 찾는 방법에 대한 다른 아이디어가 있다면 그것도 좋을 것입니다.
해결책
XOR 비트를 어떻게 수행하는지 잘 모르겠습니다(적어도 속도는 느려야 합니다.현재 GPU에서는 이를 가속화할 수 없다고 생각합니다. 하지만 제 생각은 다음과 같습니다.
- 두 개의 입력 이미지가 있습니다
- 폐색 쿼리를 켭니다.
- 두 개의 이미지를 화면에 그립니다(예:두 개의 텍스처가 설정된 전체 화면 쿼드), abs(texel1-texel2)를 계산하고 픽셀(버리다 GLSL에서) 픽셀이 똑같다 (차이는 0이거나 일부 임계값보다 낮습니다).가장 쉬운 방법은 아마도 GLSL 프래그먼트 셰이더를 사용하는 것입니다. 거기서 두 개의 텍스처를 읽고 차이에 대한 abs()를 계산하고 픽셀을 버립니다.여기서는 매우 기본적인 GLSL 지식이면 충분합니다.
- 쿼리를 통과한 픽셀 수를 가져옵니다.동일한 픽셀의 경우 쿼리가 통과되지 않으며(픽셀은 셰이더에 의해 삭제됨), 다른 픽셀의 경우 쿼리가 통과됩니다.
처음에는 깊이 버퍼와 관련된 더 복잡한 접근 방식을 생각했지만 픽셀을 죽이는 것만으로도 충분하다는 것을 깨달았습니다.내 원본은 다음과 같습니다(그러나 위의 것이 더 간단하고 효율적입니다).
- 두 개의 입력 이미지가 있습니다
- 깨끗한 화면과 깊이 버퍼
- 두 개의 이미지를 화면에 그립니다(예:두 개의 텍스처가 설정된 전체 화면 쿼드), abs(texel1-texel2)를 계산하고 픽셀(버리다 GLSL에서) 픽셀이 다른 경우.깊이 버퍼 값이 평면에 가까운 값이 되도록 쿼드를 그립니다.
- 이 단계 후에 깊이 버퍼에는 동일한 픽셀에 대한 작은 깊이 값과 다른 픽셀에 대한 큰(원거리 평면) 깊이 값이 포함됩니다.
- 폐색 쿼리를 켜고 깊이가 원거리 평면보다 가깝지만 이전 쿼드보다 큰 또 다른 전체 화면 쿼드를 그립니다.
- 쿼리를 통과한 픽셀 수를 가져옵니다.동일한 픽셀의 경우 쿼리가 통과하지 못하고(깊이 버퍼가 이미 더 가까워짐) 다른 픽셀의 경우 쿼리가 통과됩니다.이를 얻으려면 SAMPLES_PASSED_ARB를 사용합니다.다음 위치에 폐색 쿼리 예제가 있습니다. CodeSampler.com 시작하려면.
물론 이 모든 작업에는 폐색 쿼리를 지원하는 GPU가 필요합니다.2002년 이후 대부분의 GPU는 일부 저가형 GPU(특히 Intel 915(일명 GMA 900) 및 Intel 945(일명 GMA 950))를 제외하고 이를 지원합니다.
제휴하지 않습니다 StackOverflow