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:
- have 2 input images
- turn on occlusion query.
- 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.
- 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):
- have 2 input images
- clear screen , depth buffer
- 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.
- after step, depth buffer contain small depth values pixels same, , large (far plane) depth values pixels different.
- turn on occlusion query, , draw full screen quad depth closer far plane, larger previous quad.
- 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
Post a Comment