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

Foi útil?

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:

  1. tem duas imagens de entrada
  2. ligar consulta oclusão.
  3. 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.
  4. 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):

  1. tem duas imagens de entrada
  2. tela clara e buffer de profundidade
  3. 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.
  4. 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.
  5. ligar consulta oclusão e desenhe outro quad tela cheia com profundidade mais perto do plano muito, mas maior do que o quad anterior.
  6. 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)).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top