2010-12-16 5 views
5

Déjame ver si puedo hacer esta pregunta de manera legible:Comportamiento de OpenGL en un motor basado en mosaico 2D: pixel "snapping" cuando está en movimiento, ¿errores de aproximación?

Escribo un motor basado en mosaico 2D en OpenGL ES, con la intención de que parezca un motor de trama de la vieja escuela. Mis recursos artísticos tienen una resolución nativa (es decir, 1: 1 pixel art) y se mapean en polígonos rectangulares, y mi vista OpenGL es ortogonal y abarca el rectángulo (0.0, 0.0) a (screen.width, screen.height) Lo hice con la esperanza de que cada píxel en la pantalla correspondería a un cuadrado de píxeles "virtual" en el plano de coordenadas XY, que a su vez correspondería a un píxel en uno de mis mosaicos. (Las fichas son 16.0 x 16.0, y el origen de mi mundo es obviamente [0.0,0.0].)

Estaba seguro de que mi motor se vería "falso" debido a errores de aproximación. Por ejemplo, pensé que dado que los píxeles del mosaico no se escribían directamente en la pantalla, ocasionalmente se podía recuperar un píxel incorrecto. También estaba seguro de que el movimiento de la cámara provocaría que OpenGL interpole cuando las teselas no estén alineadas con los píxeles de la pantalla real.

Como resultado, OpenGL se comporta casi exactamente como lo haría un motor de ráster. Cuando la cámara está quieta, cada píxel virtual se corresponde perfectamente con un píxel en la pantalla. Cuando la cámara está en movimiento, los mosaicos "ajustan" una fila/columna de píxeles a la vez en lugar de moverse suavemente mediante la interpolación. (Esto sucede incluso si el movimiento es muy lento.) Por curiosidad, traté de escalar mis fichas a 1.1x, y como esperaba, comenzaron a parecer enlodadas y el comportamiento brusco cesó. ¿Es cierto, entonces, que OpenGL se comporta de manera diferente dependiendo de si lo que está procesando puede estar perfectamente alineado con la pantalla?

¿Dónde en la especificación puedo encontrar información sobre estos problemas, y cómo puedo asegurarme de que OpenGL continúe comportándose de esta manera? Me siento incómodo al usar un valor predeterminado que no entiendo del todo, ya que el comportamiento podría cambiar teóricamente en cualquier momento.

¡Gracias!

Respuesta

3

¿Dónde en la especificación puedo encontrar información sobre este comportamiento, y cómo puedo asegurarme de que OpenGL continúe comportándose de esta manera?

Debe leer todo el capítulo "Rasterización" en la especificación. Describe exactamente qué se garantiza y cómo se supone que la implementación de OpenGL funciona;

Me siento incómodo con un valor predeterminado que no entiendo del todo, ya que el comportamiento podría cambiar en cualquier momento.

Derecha. Por lo que entiendo en su situación, el comportamiento está bien definido. Sin embargo, tenga en cuenta que la especificación da cierta libertad a las implementaciones por lo que los resultados pueden variar de una implementación a otra. Por ejemplo, en la escala x1.1 o en la rotación de 20 grados de la cuadrícula, la clasificación exacta de los bordes ya está definida en la implementación.

Tenga en cuenta que se espera el comportamiento "instantáneo". No tiene AA activado, por lo que OpenGL no puede hacer que el movimiento sea más fluido.

Cuestiones relacionadas