Transport de lumière dans les moteurs de jeu

Introduction

Normalement, un artiste fait toute la modélisation 3D, puis toutes les textures, regarde son modèle d'apparence formidable dans le DCC 3D et dit "c'est fantastique, prêt pour l'intégration", puis va dans le jeu, l'éclairage est installé et le jeu fonctionne.

Alors, à quel moment toute cette activité "HDR" entre-t-elle en jeu ? Pour comprendre la réponse, nous devons examiner le comportement des écrans.

Votre écran affiche des rapports de lumière linéaire allant d'une intensité maximale à une intensité minimale. Les moteurs de jeux modernes effectuent des calculs complexes sur les valeurs de lumière linéaire dans leurs scènes respectives. Alors quel est le problème ?

La plage d'intensité de l'affichage est limitée en fonction du type d'affichage. Le moteur de jeu rend à une gamme illimitée de valeurs d'intensité, cependant. Alors que "intensité maximale" signifie quelque chose pour un affichage sRGB, il n'a aucun rapport avec le moteur de jeu ; il n'y a qu'une gamme potentiellement infiniment large de valeurs d'intensité générées par image de rendu(per frame of rendering).

Cela signifie que certaines transformations de l'intensité de la lumière de la scène, également connues sous le nom de ratios de lumière liés à la scène, doivent être transformées et mappées pour s'inscrire dans la plage de sortie particulière de l'affichage choisi. Ceci est plus facile à comprendre si nous envisageons de photographier virtuellement notre scène de moteur de jeu avec une caméra virtuelle. Ici, notre caméra virtuelle appliquerait une transformation de rendu de caméra particulière aux données de la scène et la sortie serait prête pour l'affichage sur un type d'affichage particulier.

Écrans d'ordinateur

Presque tous les écrans nécessitent un codage non linéaire pour les valeurs de code qui leur sont envoyées. L’affichage, à son tour, utilisant sa caractéristique de transfert unique, "décode" la valeur de code en rapports de sortie linéaires, et projette les rapports à partir des lumières de couleur unique sur chaque site d’émission rougeâtre, verdâtre et bleuâtre.

Pour une majorité des affichages faits par ordinateur, les spécifications de l'affichage sont soulignés en accord avec IEC 61966-2-1, connu aussi sous le nom des spécifications sRGB de 1996. Ces spécifications indiquent comment un affichage sRGB devrait se comporter, y compris la couleur de la lumière dans les LED des pixel ainsi que les caractéristiques du transfert de l'entrée (OETF) à la sortie (EOTF).

Cependant, tous les affichage n'utilisent pas les même OETF et EOTF qu'un affichage d'ordinateur, par exemples, un affichage d'émission télé utilise le BT.1886 EOTF. Cependant, Godot ne prend actuellement en charge que les écrans sRGB.

La norme sRGB est basée sur la relation non linéaire entre le courant et la luminosité des écrans CRT des ordinateurs de bureau courants.

../../_images/hdr_gamma.png

Les mathématiques d'un modèle de scène de référence exigent que nous multiplions la scène par différentes valeurs pour ajuster les intensités et l'exposition à différentes plages de lumière. La fonction de transfert de l'affichage ne peut pas rendre correctement la plage dynamique plus large de la sortie de scène du moteur de jeu en utilisant la simple fonction de transfert de l'affichage. Une approche plus complexe de l'encodage est nécessaire.

Scène linéaire et pipelines d'assets

Travailler dans une scène linéaire sRGB n'est pas aussi simple que d'appuyer simplement sur un commutateur. Tout d'abord, les assets d'images importées doivent être converties en ratios de lumière linéaire à l'importation. Même lorsqu'ils sont linéarisées, ces assets peuvent ne pas être parfaitement adaptés à une utilisation en tant que textures, selon la façon dont elles ont été générées.

Il y a deux façon de faire cela :

Fonction de transfert sRGB pour afficher les rapports linéaires lors de l'importation d'images

C'est la méthode la plus facile d'utiliser les assets sRGB, mais pas la plus idéale. L'un des problèmes est la perte de qualité. L'utilisation de 8 bits par canal pour représenter les rapports de lumière linéaire n'est pas suffisante pour quantifier correctement les valeurs. Ces textures peuvent aussi être compressées plus tard, ce qui peut exacerber le problème.

Fonction de transfert matériel sRGB pour afficher la conversion linéaire

Le GPU effectuera la conversion après avoir lu le texel en nombre flottant. Cela fonctionne bien sur PC et consoles, mais la plupart des appareils mobiles ne le supportent pas, ou ne le supportent pas au format texture compressé (iOS par exemple).

Scène linéaire pour affichage référé non linéaire

Une fois le rendu terminé, le rendu linéaire de la scène doit être transformé en une sortie appropriée telle qu'un affichage sRGB. Pour ce faire, activez la conversion sRVB dans le Environnement (plus d'informations à ce sujet ci-dessous).

Gardez à l'esprit que les conversions sRGB -> Display Linear et Display Linear -> sRGB doivent toujours être toutes les deux activées. Si l'une d'entre elles n'est pas activées, il en résultera d'horribles visuels qui ne conviendront qu'aux jeux indépendants expérimentaux d'avant-garde.

Paramètres de HDR

Le réglage HDR se trouve dans la ressource Environnement. On les trouve la plupart du temps dans un nœud WorldEnvironment ou dans une caméra. Pour plus d'informations, voir Environnement et post-traitement.