shader - Count image similarity on GPU [OpenGL/OcclusionQuery] -


opengl. let's i've drawn 1 image , second 1 using xor. i've got black buffer non-black pixels somewhere, i've read can use shaders count black [ rgb(0,0,0) ] pixels on gpu?

i've read has occlusionquery. http://oss.sgi.com/projects/ogl-sample/registry/arb/occlusion_query.txt

is possible , how? [any programming language]

if you've got other idea on how find similarity via opengl/gpu - great too.

i'm not sure how xor bit (at least should slow; don't think of current gpus accelerate that), here's idea:

  1. have 2 input images
  2. turn on occlusion query.
  3. draw 2 images screen (i.e. full screen quad 2 textures set up), fragment shader computes abs(texel1-texel2), , kills pixel (discard in glsl) if pixels the same (difference 0 or below threshold). easiest using glsl fragment shader, , there read 2 textures, compute abs() of difference , discard pixel. basic glsl knowledge enough here.
  4. get number of pixels passed query. pixels same, query won't pass (pixels discarded shader), , pixels different, query pass.

at first though of more complex approach involves depth buffer, realized killing pixels should enough. here's original though (but above 1 simpler , more efficient):

  1. have 2 input images
  2. clear screen , depth buffer
  3. draw 2 images screen (i.e. full screen quad 2 textures set up), fragment shader computes abs(texel1-texel2), , kills pixel (discard in glsl) if pixels different. draw quad it's depth buffer value close near plane.
  4. after step, depth buffer contain small depth values pixels same, , large (far plane) depth values pixels different.
  5. turn on occlusion query, , draw full screen quad depth closer far plane, larger previous quad.
  6. get number of pixels passed query. pixels same, query won't pass (depth buffer closer), , pixels different, query pass. you'd use samples_passed_arb this. there's occlusion query example @ codesampler.com started.

of course requires gpu occlusion query support. gpus since 2002 or support that, exception of low-end ones (in particular, intel 915 (aka gma 900) , intel 945 (aka gma 950)).


Comments

Popular posts from this blog

c++ - How do I get a multi line tooltip in MFC -

asp.net - In javascript how to find the height and width -

c# - DataTable to EnumerableRowCollection -