Renderizado en PS1: texturas, vértices y orden de dibujo
Al trabajar en el renderizado de Polygon Engine, necesitaba entender cuáles de los defectos visuales asociados con PS1 venían del hardware y cuáles podían ser errores de implementación. La deformación de las texturas, los pequeños saltos de los vértices y los polígonos que aparecen en un orden incorrecto pueden coincidir en una escena, pero tienen causas distintas.
Separarlos me ayudó a revisar cada etapa del renderizado con más claridad. Para explicar cómo se relacionan, primero conviene seguir el proceso que convierte los vértices de un modelo en una imagen. Después se puede ver dónde aparece cada problema y qué opciones hay para reducirlo.
De los vértices del modelo a las coordenadas de pantalla
El proceso comienza con las posiciones de los vértices del modelo. Esas posiciones se transforman respecto a la cámara y se proyectan en la pantalla. En PS1, el GTE acelera operaciones de transformación y proyección; después, la GPU recibe comandos con las primitivas que debe dibujar en coordenadas de pantalla.
Por lo tanto, antes de enviar una primitiva a la GPU, el engine ya debe haber preparado su geometría y decidido cómo organizar el dibujo. La referencia del GTE me sirve para consultar qué cálculos puede realizar el coprocesador y cuáles debe resolver el código del engine.
Al revisar estas transformaciones también hay que considerar la precisión de los datos. Una posición puede estar bien calculada en el modelo y perder precisión al convertirse a coordenadas de pantalla. Durante un movimiento lento de cámara, esa diferencia puede volverse visible en los bordes de los polígonos.
La interpolación afín de texturas
Un piso con mosaicos permite observar con facilidad la deformación de las texturas. La parte cercana a la cámara ocupa más espacio en pantalla que la parte lejana. Para representar esa perspectiva correctamente, la interpolación de las coordenadas de textura tendría que considerar la diferencia de profundidad a lo largo de la superficie.
La GPU de PS1 utiliza interpolación afín de texturas. Interpola las coordenadas de textura en el espacio de pantalla sin la corrección de perspectiva que normalmente aplica un sistema moderno. Por eso un triángulo grande con diferencias importantes de profundidad puede mostrar mosaicos que se doblan o deslizan cuando se mueve la cámara.
Eso es independiente de que el triángulo se haya dibujado en el orden correcto. Ordenarlo perfectamente no cambia cómo se interpolan las coordenadas de textura en su interior. La documentación de la GPU describe el comportamiento de primitivas y texturas detrás de esta diferencia.
La subdivisión ayuda a reducir ese efecto al dividir la superficie en piezas más pequeñas. Cada pieza abarca una diferencia menor de profundidad, de modo que la aproximación afín suele verse mejor. Al incorporarla al flujo del engine, también hay que considerar su costo: aumenta la cantidad de vértices y de paquetes de primitivas que se preparan y ordenan.
La precisión y la inestabilidad de los vértices
La inestabilidad de los vértices se puede observar incluso en una superficie sin textura. Si el contorno da pequeños saltos durante un movimiento lento de cámara, conviene revisar la precisión de las coordenadas en lugar de modificar el mapeo de la imagen.
Las coordenadas de pantalla tienen precisión limitada, y los cálculos geométricos utilizan formatos numéricos finitos. Un movimiento suave en una representación de mayor precisión termina convertido en pasos discretos en una imagen de baja resolución. Pequeños cambios cerca de un límite de redondeo pueden ser muy visibles en un borde de alto contraste.
Eso no significa que cada salto visible sea una característica inevitable del hardware. Un engine puede introducir errores propios mediante redondeos inconsistentes, una escala inadecuada o una transformación que excede su rango numérico. Necesito distinguir la cuantización esperada de los errores que ocurren antes de que la GPU reciba la primitiva.
Esta diferencia también afecta cómo uso la vista previa de Polygon Engine. Simular la inestabilidad de vértices en el editor ayuda a evaluar la apariencia de una escena, pero el juego exportado utiliza su propio proceso de transformación. Necesito revisar ese resultado para saber si el comportamiento es el esperado en la consola.
El orden de los polígonos y el recorte
La GPU de PS1 no tiene un búfer de profundidad de propósito general que resuelva la superficie más cercana para cada píxel. Una estrategia común es organizar las primitivas en una tabla de ordenamiento para enviar la geometría lejana antes que la cercana.
La dificultad está en asignar un orden de profundidad a un polígono completo cuando sus partes están a profundidades distintas. Dos superficies que se cruzan pueden exigir órdenes contradictorios. Un valor promedio de profundidad no describe qué superficie está delante en cada punto de la intersección.
Una tabla de ordenamiento más precisa puede reducir las coincidencias entre grupos de profundidad, pero no resuelve esa ambigüedad geométrica. Dividir superficies problemáticas puede ayudar. También ayuda diseñar la geometría y los recorridos de cámara para reducir los traslapes ambiguos. Ninguna de esas estrategias convierte una tabla de ordenamiento en un búfer de profundidad.
Otro caso que reviso por separado es el recorte contra el plano cercano de la cámara. Cuando un polígono cruza ese plano, hace falta tratarlo antes de proyectarlo y dibujarlo. Las instrucciones del GTE no sustituyen un algoritmo completo de recorte, así que una superficie que se estira o desaparece al acercarse puede señalar un problema en esa parte del engine.
Probar cada problema de renderizado por separado
Para distinguir estos casos, una escena de prueba puede incluir un piso cuadriculado, dos superficies sin textura que se crucen y una cámara con movimiento lento. Con pocos elementos es más fácil observar qué cambia al ajustar la geometría o el renderizado.
El patrón cuadriculado permite evaluar la deformación de la textura. Los contornos sin textura muestran los saltos de coordenadas, y las superficies cruzadas permiten revisar el orden de dibujo. Así se puede comprobar, por ejemplo, si una subdivisión mejoró el mapeo o si únicamente cambió la forma en que se superponen los polígonos.
Entender estas diferencias me ayudó a decidir qué resolver en el renderizado y qué apoyar desde las herramientas de creación de niveles. Algunos comportamientos requieren corregir cálculos; otros se pueden reducir al dividir una superficie o ajustar la geometría. Tener clara la causa evita modificar partes del engine que no están relacionadas con el problema.