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?
fuente
Respuestas:
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.
fuente
Creo que almacenaría dos conjuntos de coordenadas.
DISPLAY POSITION
yTRUE 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.
fuente