¿Cómo implemento anti-aliasing en OpenGL?


28

Quiero hacer un suavizado de pantalla completa en OpenGL, y no quiero usar el suavizado proporcionado por OpenGL, ya que estoy construyendo un juego y quiero buenos efectos en él.

¿Cómo debo proceder?


Por "el suavizado proporcionado por GL", ¿se refiere a las antiguas sugerencias de calidad de líneas y polígonos mal nombradas que están etiquetadas como "suavizado", o se refiere al uso de MSAA regular a través de visuales GLX / WGL?
Lars Viklund

Respuestas:


28

Hay varias alternativas al MSAA nativo en OpenGL. Con los efectos de posprocesamiento, lo mejor de ellos es que generalmente puede simplemente tirar el sombreador a la imagen final sin procesar y hace el resto. Aquí hay tres métodos que vale la pena echarle un vistazo:

  • Anti-Aliasing rápido aproximado (Geeks3D) : bueno en la mayoría de los casos. Bastante fácil de aplicar y entender. El inconveniente es fuerte, el ruido de alto contraste en las texturas se vuelve un poco borroso. Los bordes tan sutiles como empinados de 1/4 píxeles se ven tan precisos como el MSAA tradicional. Algo menos pronunciado que eso, pierde un poco de precisión.

  • Anti-Aliasing con filtro normal (GameDev ): aún no lo he probado con precisión, pero es el más fácil de entender. En el mejor de los casos se asemeja a 16x MSAA y en el peor de los casos es como 2x MSAA. Genera un mapa normal temporal para representar aristas y ángulos relativos. Puede muestrear el mapa normal con diferencia de luma o diferencia de color.

  • Anti-Aliasing Morfológico (Iryoku) - mejorado a SMAA - Subpixel Mophological AA. Es bastante complejo con 4 pases, pero logra los mejores resultados que he visto. Crea gradientes a lo largo de bordes tan graduales como 1/100 a 1/200 píxeles de inclinación (!). El muestreo puede basarse en luma, en color o en profundidad. Las texturas se mantienen muy nítidas y limpias. (el ejemplo está basado en DX10 y HLSL, llevaría algún tiempo transferirlo a GLSL con precisión)

Estas técnicas no tienen supermuestreo o multimuestra, por lo que las líneas que aparecen con menos de 1 píxel de grosor aparecerán con espacios y no se suavizarán correctamente. Esta es la desventaja de usar un enfoque que no sea MSAA. Como solo está trabajando con una imagen ráster a resolución completa, no puede crear información adicional a partir de estos espacios vacíos.

Tenga en cuenta que todas estas técnicas dependen del muestreo de valores de luma (brillo) o croma (color) adyacentes. Calcular la luma y la corrección gamma opcional requiere instrucciones adicionales sobre el sombreador AA, aunque es bastante sencillo. Puede descargar esto calculando la luma en el sombreador anterior que proporciona la imagen sin retocar, almacenando la luma en el canal alfa. Luego, en el sombreador AA, simplemente probará el alfa.


7

Hay muchas formas de hacer antialiasing. Una es usar el antialiasing multimuestra (MSAA), donde su búfer posterior realmente almacena múltiples muestras de subpíxeles, y cuando renderiza triángulos, líneas, etc., el sistema llena automáticamente el conjunto correcto de muestras en cada píxel. Luego, al final de la representación, la imagen se "resuelve" promediando todas las muestras de subpíxeles para obtener una muestra por píxel.

Otra forma es usar antialiasing postprocesamiento, donde se procesa la escena como normal y luego se difumina de forma selectiva en el resultado final para ocultar los bordes con alias. Hay una variedad de técnicas para esto, pero una de las mejores / más populares en este momento se llama FXAA (Anti-Aliasing rápido aproximado).

MSAA generalmente dará mejores resultados que el AA de procesamiento posterior, pero puede ser más lento porque requiere aproximadamente el doble del ancho de banda de memoria para cada operación de renderizado. MSAA también puede requerir más memoria de video que AA de postprocesamiento, dependiendo de los detalles de la configuración.

Puede encontrar información específica sobre la implementación de MSAA o FXAA en la Web, solo busque en Google cualquiera de esos términos.


2

¿Estás dispuesto a codificar tu propio sombreador GLSL? Si es así, consulte este tutorial.


así me gustaría que hacerlo usando shaders porque im usando shaders para otros efectos como well.Could suministrados por algunos otros enlaces para shaders así
Noddy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.