J'essaie de comprendre ce qu'est le HDR et comment il fonctionne.
Je comprends les concepts de base et ai une légère idée de la façon dont il est mis en œuvre avec D3D / hlsl.
Cependant, c'est encore assez brumeux.
Supposons que je rende une sphère avec une texture de la terre et une petite liste de points de sommets pour agir comme des étoiles, comment pourrais-je rendre cela en HDR?
Voici quelques choses qui me déroutent:
Je suppose que je ne peux pas utiliser n'importe quel format d'image de base pour la texture car les valeurs seraient limitées à [0, 255] et limitées à [0, 1] dans un shader. Il en va de même pour le tampon arrière, je suppose que le format doit être un format à virgule flottante?
Quelles sont les autres étapes impliquées? Assurément, il doit y avoir plus que simplement utiliser des formats à virgule flottante pour effectuer un rendu sur une cible de rendu, puis appliquer un certain bloom comme post-traitement? (compte tenu de la sortie sera de 8 bpp de toute façon)
En gros, quelles sont les étapes du HDR? Comment ça marche ? Je n'arrive pas à trouver de bons articles / articles décrivant le processus, autre que celui-ci , mais il semble un peu survoler les bases, donc c'est déroutant.
Techniquement, HDR signifie simplement utiliser une plus grande gamme de valeurs possibles pour vos graphiques. Habituellement, vous êtes limité à 256 valeurs discrètes pour les canaux rouge, vert et bleu, ce qui signifie que si vous avez 2 éléments, un deux fois plus lumineux que l'autre, et un troisième qui est 10 000 fois plus lumineux que le premier, il n'y a pas vous pouvez représenter correctement les 3 éléments de la même scène - soit vous rendez l’objet lumineux seulement 256x plus lumineux que le premier, soit vous rendez les deux objets ternes complètement noirs (en perdant le contraste entre eux), puis l’objet lumineux est infiniment plus lumineux que les deux.
Ceci est facile à résoudre en utilisant des valeurs à virgule flottante pour les valeurs rouge / vert / bleu - mais vous avez maintenant le problème de savoir comment afficher cela sur un périphérique graphique qui ne gère qu'un nombre fixe de valeurs discrètes par canal (par exemple 256) . La deuxième partie du problème est donc de savoir comment mapper vos valeurs à virgule flottante sur la plage limitée. La solution triviale est de mettre à l'échelle toutes les valeurs proportionnellement dans la plage discrète, mais cela signifierait qu'un pixel très lumineux pourrait rendre le reste de l'écran noir, etc. Parfois, c'est ce que vous voulez, parfois ce n'est pas - voir le mappage de ton de CiscoIPPhone lien pour des exemples de la façon dont vous pouvez aborder cela.
Ce ne sont généralement pas vos textures qui doivent être stockées dans un nouveau format - c'est lorsque l'éclairage leur est appliqué que vous devez pouvoir accepter de plus grandes valeurs. Évidemment, cependant, si vous avez des sources de lumière cuites dans une texture - par exemple. un fond étoilé - vous voudrez peut-être un format de résolution plus élevé là-bas. Ou demandez simplement au shader de mettre à l'échelle les valeurs de ces matériaux lorsque vient le temps de les rendre.
la source
Les ordinateurs représentaient traditionnellement chaque pixel à l'écran comme seulement 24 bits en mémoire: 8 pour le rouge, 8 pour le vert et 8 pour le bleu. C'est presque assez de bits qu'un humain ne remarquerait pas si vous en ajoutiez plus, et l'octet 8 bits est très pratique pour les microprocesseurs, c'est donc ce qui est coincé.
Bien que 8 bits soit presque assez de précision pour afficher une image, ce n'est certainement pas assez de précision pour calculer une image. À différents moments du calcul d'une image, au moins 32 bits de précision sont requis.
C'est pourquoi les pixel shaders calculent les couleurs avec une précision de 32 bits, même lorsque vous effectuez un rendu sur une image de précision 8 bits. Sinon, vous ne pourriez pas par exemple diviser une valeur par 1000, puis la multiplier plus tard par 1000, car la division de toute valeur de 8 bits par 1000 entraîne zéro.
Les graphiques 3D en temps réel ont tendance à conserver tous les graphiques avec une précision> 8 bits jusqu'au dernier moment possible, moment auquel les> 8 bits de rouge sont sous-échantillonnés à 8 bits, et ainsi de suite pour le vert et le bleu.
HDR se réfère à l'acte de rendre des images qui ont une précision supérieure à 8 bits. Dans les jeux vidéo télévisés contemporains, la précision 16 bits est la norme, et cela peut être "suffisant" dans les jeux vidéo pour les années à venir.
la source
Un aspect dont je pense que la clé pour le HDR est l'application correcte du moniteur gamma.
Le moniteur que vous regardez produit de la lumière en fonction des pixels d'entrée. Vous pourriez vous attendre à ce qu'un pixel de valeur 255 produise (environ) 255 fois plus de lumière qu'un pixel de valeur 1. Ce n'est pas le cas. Avec un gamma de moniteur standard de 2,3, il est 255 ^ 2,3 fois plus lumineux, soit environ 340000!
Tout le monde qui produit du contenu (fabricants de caméras) le sait, ou (si vous êtes un concepteur) vous le compensez implicitement.
C'est très bien si vous rendez simplement des bitmaps (enfin, la plupart du temps), mais si vous les utilisez comme textures dans une scène 3D, c'est une autre histoire. Si vous souhaitez modéliser correctement l'interaction avec la lumière, vous devez utiliser des calculs de lumière linéaires tout au long du pipeline de rendu. Ça signifie
corriger vos textures pour gamma
rendre tout avec une lumière linéaire (où vous avez besoin de beaucoup de précision en raison de la plage dynamique élevée de la lumière),
appliquez la transformation gamma inverse du moniteur comme dernière chose avant de mettre l'image à l'écran.
Lorsque vous apportez ce changement à une scène existante, avec des illustrations, des lumières, etc., vous devez probablement corriger beaucoup de vos intensités lumineuses et textures, car elles ont été choisies pour être belles lors du rendu avec une lumière non linéaire. Ce n'est donc pas une fonctionnalité que vous pouvez simplement "activer" et vous attendre à ce que tout soit mieux comme ça.
la source