¿Cómo evitar los valores de subpíxeles en un juego 2D de resolución independiente con proyección ortográfica?

8

Estoy tratando de hacer una representación independiente de la resolución de sprites en movimiento en un juego 2D. Mi plan es trabajar en un sistema de coordenadas fijo en mi mundo (por ejemplo, 960x540) y usar proyección ortográfica para escalarlo hacia arriba o hacia abajo para que se ajuste a la ventana gráfica. Hago letterboxing para manejar diferentes relaciones de aspecto.

De acuerdo con la mayoría de los tutoriales, soy libre de usar cualquier dimensión que me guste para la vista frustum, pero descubrí que en muchos casos eso lleva al problema de que termino usando valores de subpíxeles en la ventana gráfica. Por ejemplo, un vértice en (62,62) en un sistema de coordenadas de 960 x 540 termina en (51.6666667,51.6666667) en una ventana con las dimensiones 800 x 450.

Noté dos tipos de problemas con eso:

  • el muestreo de textura cambia todo el tiempo para los objetos que están en movimiento, dependiendo de dónde estén los vértices en relación con un centro de píxeles
  • mis objetos se estiran horizontal o verticalmente por un píxel de vez en cuando debido al redondeo

¿Cuál es la mejor práctica para evitar esto (mientras se mantiene la independencia de resolución en términos de velocidades de movimiento, etc.)? ¿Y dónde sería el mejor lugar para hacer frente a esto? ¿Antes de pasar los vértices a los sombreadores o dentro del sombreador de vértices?

Eric
fuente
¿Cómo va el cambio de tamaño y las traducciones para que quepan en la nueva ventana gráfica? Matrices? ¿Escalar manualmente y mover las posiciones de los objetos?
Emir Lima
@EmirLima Estoy multiplicando las coordenadas por un modelo combinado de vista-proyección-matriz dentro de mi sombreador de vértices. Todo el escalado se realiza mediante la matriz de proyección ortográfica.
Eric
podría redondear o
colocar los cables en
@ tm1rbrt Gracias por tu comentario. Creo que siempre tendría que usar el piso o el techo para evitar el 1 píxel más o menos de ancho o alto. Traté de hacer eso dentro del sombreador de vértices, pero la imprecisión en los cálculos allí lo hace difícil, si no imposible. Terminé pavimentando lo que deberían haber sido enteros perfectos para el entero anterior.
Eric

Respuestas:

1

Para llegar a su pregunta principal, si influye o no en los vértices antes o durante el sombreador, se prefiere usar un sombreador. Si sabe cómo escribir una rutina que pueda tener en cuenta la ventana gráfica y el sistema de coordenadas, se prefiere usar un sombreador ya que permite que muchos sprites se ajusten en paralelo. Además, garantiza que las coordenadas "cosméticas" se mantengan separadas de las coordenadas del juego en el código de la CPU para que una no influya en la otra.

Puede hacerlo en el vértice O en el sombreador de píxeles. En el sombreador de píxeles, es posible cambiar los texels para bloquearlos en los píxeles de la pantalla.

En DirectX9, necesitaba hacer esto con HLSL para evitar la peculiaridad de que las esquinas de texel estaban ubicadas en 0.5, 0.5 en relación con el píxel , haciendo que las texturas nítidas se vean semi borrosas. Corregir esto cambia la ubicación física de los texels sin mover los vértices.

En su caso, el desplazamiento variará de cuadro a cuadro, así que pase las coordenadas verdaderas del sprite al sombreador para calcular el desplazamiento decimal. Recuerde ABRAZAR el muestreo de textura para evitar envolver las texturas.

ChrisC
fuente
3

Creo que almacenaría dos conjuntos de coordenadas.

  1. Uno usado para dibujar tus objetos DISPLAY POSITIONy
  2. un segundo usado para mantener a TRUE POSITION.

De esta manera, puede dibujar sprites con coordenadas redondeadas para eliminar la distorsión causada por el tamaño fijo del área de visualización.

Pero esto también te permite mantener la ubicación exacta sin influir en la lógica de tu juego. Debido a la naturaleza de los subpíxeles, también creo que ni siquiera notarás ninguna discrepancia entre la vista y la lógica del juego.

Joe
fuente