Contagem semelhança de imagem na GPU [OpenGL / OcclusionQuery]
Pergunta
OpenGL. Digamos que eu tenha desenhado uma imagem e, em seguida, o segundo usando XOR. Agora eu tenho tampão preto com pixels não-negros em algum lugar, eu li que eu possa usar shaders para contar black [rgb (0,0,0)] pixels na GPU?
Também li que ele tem que fazer algo com OcclusionQuery. http://oss.sgi.com/projects/ogl- sample / registro / ARB / occlusion_query.txt
É possível e como? [Qualquer linguagem de programação]
Se você tem outra idéia sobre como encontrar semelhança via OpenGL / GPU -. Que seria grande demais
Solução
Eu não sei como você faz o bit XOR (pelo menos deveria ser lento, eu não acho que nenhum de GPUs atuais acelerar isso), mas aqui é a minha idéia:
- tem duas imagens de entrada
- ligar consulta oclusão.
- desenhar as duas imagens para a tela (ou seja quad tela cheia com duas texturas criadas), com um fragmento de shader que calcula abs (texel1-texel2), e mata o pixel ( descarte em GLSL ) se os pixels são o mesmo (diferença é zero ou abaixo de algum limite). Mais fácil é, provavelmente, apenas usando um fragmento de shader GLSL, e lá você acabou de ler duas texturas, abs de computação () da diferença e descartar o pixel. Muito conhecimento básico GLSL é suficiente aqui.
- obter o número de pixels que passaram a consulta. Para pixels que são os mesmos, a consulta não vai passar (pixels serão descartadas pelo shader), e para pixels que são diferentes, a consulta vai passar.
No começo eu embora de uma abordagem mais complexa que envolve buffer de profundidade, mas então percebeu que apenas matar pixels deve ser suficiente. Aqui está a minha embora original (mas o acima é mais simples e mais eficiente):
- tem duas imagens de entrada
- tela clara e buffer de profundidade
- desenhar as duas imagens para a tela (ou seja quad tela cheia com duas texturas criadas), com um fragmento de shader que calcula abs (texel1-texel2), e mata o pixel ( descarte em GLSL ) se os pixels são diferentes. Desenhar o quad para que ele de valor buffer de profundidade é algo perto de avião perto.
- após este passo, buffer de profundidade conterá valores de profundidade pequenas para os pixels que são o mesmo, e grande (longe avião) valores de profundidade de pixels que são diferentes.
- ligar consulta oclusão e desenhe outro quad tela cheia com profundidade mais perto do plano muito, mas maior do que o quad anterior.
- obter o número de pixels que passaram a consulta. Para pixels que são os mesmos, a consulta não vai passar (buffer de profundidade já mais perto é), e para pixels que são diferentes, a consulta vai passar. Você usaria SAMPLES_PASSED_ARB para conseguir isso. Há um exemplo de consulta oclusão em CodeSampler.com para obter o seu início.
Claro que tudo isso exige GPU com suporte a consultas de oclusão. A maioria das GPUs desde 2002 ou assim fazer apoio que, com exceção de alguns mais low-end (em particular, Intel 915 (aka GMA 900) e Intel 945 (aka GMA 950)).