Démos

Accueil - Présentation - Démos - À propos


GPU - Rendu 3D - Jeux - Autre

PS3D

PS3D est un moteur de rendu software rétro en C et SDL, ayant pour but de reproduire le style visuel de la 3D de la Playstation 1 ou de la Sega Saturn, grâce à  la présence de quelques contraintes :

Exemple

Exemple avec un niveau de Spyro 2 texturé et éclairé :



L'idée du projet m'est venue suite à  la venue progressive du style "low-poly PS1", tel qu'on peut en voir ici et là , malheureusement souvent réalisé avec des technologies récentes qui donnent un aspect trop propre aux scènes : Zbuffer, calculs en nombres à  virgule, correction de perspective pour la texture, lightmap en texture sur un second niveau d'UV et parfois même avec du mip mapping..

Le but est de faire un visualiseur de scènes et personnages, permettant de faire des vues sur 360° en forçant à  composer avec les limitations listées plus haut, nécessaire pour obtenir le résultat voulu.

L'application charge des fichiers PLY natifs, format ASCII comprenant des coordonnées UV et une couleur de vertex dans laquelle on peut précalculer l'éclairage, comme la plupart des jeux de cette génération.

Affichage 2D

L'application se constitue de deux parties séparées : une pour le dessin 2D et l'autre pour l'exploitation 3D. La partie 2D permet d'afficher des formes vectorielles simples :

Exemple :


Les trois premières primitives étaient relativement populaires dans les jeux 3D du début des années 90, pour faire des particules et des explosions. La partie 2D ne contient pas encore de mode de fusion spécifique, les formes se recouvrent à  l'affichage.

Tessellation adaptative

Les premières implémentations d'application de texture se faisaient par une interpolation linéaire d'une image sur un triangle forcément vu de face, ce qui occasionne le bug suivant sur un mur en vue oblique :


Les textures du sol sont étirées au fur et à  mesure qu'un des point du triangle se rapproche de la caméra, et donc notamment de la division par zéro. Par ailleurs, les triangles passant derrière la caméra doivent être annulés à  l'affichage, ce qui peut occasionner un trou dans le modèle sur les bords de l'écran.


Une solution quelque-peu brutale consiste à  subdiviser le modèle pour stabiliser l'interpolation de la texture. Bien entendu, hors de question de le faire sur tout le modèle et de stocker l'ensemble en mémoire, la géométrie étant un gouffre à  mémoire et à  bande passante. On peut subdiviser les triangles les plus proches, mais cela pose aussi quelques autres problèmes.

Technique naïve : subdivision complète du triangle

L'idée consiste à  subdivier le triangle complet lorsque l'un des point, ou plus idéalement le barycentre du triangle, dépasse une certaine limite de distance :


Problème : des trous apparaissent dans la géométrie car les points intermédiaires ne sont pas reliés explicitement à  leurs voisins directs.

De nombreux jeux des débuts de la PS1 sont sujets au problème, comme Destruction Derby, où on peut voir apparaître des lignes blanches à  quelque mètres de la voiture pendant toute la course.

Technique de la subdivision des arêtes

Pour régler le problème de fractures, il faudrait propager la subdivision du triangle concerné à  ses voisins, sans subdiviser l'intégralité du modèle. Cette fois, il faut appliquer le test de distance non pas sur le centre du triangle, mais sur le centre de ses arêtes. Cela donne plusieurs scénarios selon les barycentres qui passent sous la limite de distance :


Cette approche corrige l'aspect du sol :


Les crevasses sont supprimées car le test de subdivision de l'arête s'applique individuellement par triangle, mais sur base de données communes aux voisins. Les points intermédiaires "naissent" donc pour deux triangles voisins selon le scénario appliqué.

La tessellation adaptative est l'un des pilier majeur du rendu "stylisé PS1". A la fois problème et solution, elle permet un rendu à  peu près correct en l'absence totale de Z-buffer et de mathématique complexe, tout en occasionnant les sauts de texture typiques de cette génération de console impossibles à  reproduire finement avec des techniques de shader procéduraux.

Documentation

Un peu de lecture : Everything You Have Always Wanted to Know about the Playstation But Were Afraid to Ask.

Copyright © Pierre Geissler, 2019 - Tous droits réservés