Pregunta

OpenGL.Digamos que dibujé una imagen y luego la segunda usando XOR.Ahora tengo un búfer negro con píxeles que no son negros en alguna parte, leí que puedo usar sombreadores para contar píxeles negros [rgb(0,0,0)] EN la GPU.

También leí que tiene que ver algo con OcclusionQuery.http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

¿Es posible y cómo?[cualquier lenguaje de programación]

Si tiene otra idea sobre cómo encontrar similitudes a través de OpenGL/GPU, también sería genial.

¿Fue útil?

Solución

No estoy seguro de cómo se hace el bit XOR (al menos debería ser lento;No creo que ninguna de las GPU actuales acelere eso), pero esta es mi idea:

  1. tener dos imágenes de entrada
  2. activar la consulta de oclusión.
  3. dibuje las dos imágenes en la pantalla (es decir,quad de pantalla completa con dos texturas configuradas), con un sombreador de fragmentos que calcula abs(texel1-texel2) y elimina el píxel (desechar en GLSL) si los píxeles son lo mismo (la diferencia es cero o está por debajo de algún umbral).Probablemente lo más fácil sea simplemente usar un sombreador de fragmentos GLSL, y allí simplemente lee dos texturas, calcula abs() de la diferencia y descarta el píxel.Un conocimiento muy básico de GLSL es suficiente aquí.
  4. Obtenga el número de píxeles que pasaron la consulta.Para los píxeles que son iguales, la consulta no se aprobará (el sombreador descartará los píxeles) y para los píxeles que son diferentes, la consulta se aprobará.

Al principio pensé en un enfoque más complejo que implicara un búfer de profundidad, pero luego me di cuenta de que simplemente matar píxeles debería ser suficiente.Aquí está mi original (pero el anterior es más simple y eficiente):

  1. tener dos imágenes de entrada
  2. pantalla clara y buffer de profundidad
  3. dibuje las dos imágenes en la pantalla (es decir,quad de pantalla completa con dos texturas configuradas), con un sombreador de fragmentos que calcula abs(texel1-texel2) y elimina el píxel (desechar en GLSL) si los píxeles son diferentes.Dibuje el quad de modo que su valor de búfer de profundidad sea algo cercano al plano cercano.
  4. Después de este paso, el búfer de profundidad contendrá valores de profundidad pequeños para píxeles iguales y valores de profundidad grandes (plano lejano) para píxeles diferentes.
  5. active la consulta de oclusión y dibuje otro quad de pantalla completa con una profundidad más cercana que el plano lejano, pero más grande que el quad anterior.
  6. Obtenga el número de píxeles que pasaron la consulta.Para los píxeles que son iguales, la consulta no se aprobará (el búfer de profundidad ya está más cerca) y para los píxeles que son diferentes, la consulta se aprobará.Usarías SAMPLES_PASSED_ARB para obtener esto.Hay un ejemplo de consulta de oclusión en CodeSampler.com para empezar.

Por supuesto, todo esto requiere una GPU con soporte para consultas de oclusión.La mayoría de las GPU desde 2002 aproximadamente lo admiten, con excepción de algunas de gama baja (en particular, Intel 915 (también conocido como GMA 900) e Intel 945 (también conocido como GMA 950)).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top