Question

Dans mon rendu, je produis une scène anti-aliasée sur un FBO à plusieurs échantillons, qui est échoué en un FBO dont l'attachement de couleur est une texture. La texture est ensuite lue lors du rendu au framebuffer.

Je voudrais le mettre à jour pour obtenir des résultats corrects gamma. L'avantage d'utiliser un FrameBuffer SRGB est qu'il me permet d'avoir une précision couleur un peu meilleure en stockant des valeurs SRGB non linéaires directement dans le FrameBuffer.

Ce que je ne suis pas sûr, c'est que les modifications devraient apporter pour l'obtenir et ce qui est modifié par les différents paramètres.

On dirait extension arb_framebuffer_srgb est simplement de gérer les opérations de lecture et de mélange avec SRGB framebuffers. Dans ma situation, je devrai utiliser une texture spécifiant un type de représentation SRGB, ce qui signifie que j'utiliserais l'extension Ext_texture_srgb... L'utilisation d'un format de texture linéaire désactiverait la traduction SRGB.

Edit: Mais je viens de voir ceci:

3) La possibilité de prendre en charge la mise à jour SRGB FrameBuffer et le mélange devraient-elles être un attribut du framebuffer?

Résolu: Oui. Ce devrait être une capacité de certains formats de pixels (surtout probablement juste RGB8 et RGBA8) qui indiquent que le mélange SRGB peut être activé.

Cela permet à une implémentation de simplement marquer les formats RGB8 et RGBA8 pixels RGBA8 existants en prenant en charge le mélange SRGB, puis fournissez simplement la fonctionnalité pour la mise à jour SRGB et le mélange pour de tels formats.

Maintenant, je ne sais pas quoi spécifier pour le format pixel de ma texture.

D'accord, et qu'en est-il des RenderBuffers? Le Doc ARB_FrameBuffer_SRGB ne mentionne rien des RenderBuffers. Est-il possible d'utiliser glRenderbufferStorageMultisample Avec un format SRGB, je peux donc obtenir un mélange de stockage SRGB?

Aussi, quelle est la différence entre GL_SRGB_ALPHA et GL_SRGB8_ALPHA8 Lors de la spécification du format interne pour glTexImage2D?

Était-ce utile?

La solution

Ce dont je ne suis pas sûr, c'est que les changements devrais apporter pour obtenir ceci

C'est parce que votre question ne semble pas sûre de ce que vous essayez de faire.

La clé de tout cela est à tout moment savoir quelles sont vos données d'entrée et quelles sont vos données de sortie.

Votre première étape consiste à savoir ce qui est stocké dans chacune de vos textures. Une texture particulière stockait-elle des données ou des données linéaires dans l'espace de couleurs SRGB? S'il stocke les données linéaires, utilisez l'un des formats d'image linéaires. S'il stocke les données SRGB Colorspace, utilisez l'un des formats d'image SRGB.

Cela garantit que vous récupérez les données que vous souhaitez dans vos shaders. Quand vient le temps de les écrire / de les mélanger au framebuffer, vous devez maintenant décider comment gérer cela.

Votre écran s'attend à des valeurs qui ont été pré-gamma corrigées au gamma du périphérique d'affichage. En tant que tel, si vous fournissez des valeurs linéaires, vous obtiendrez une sortie de couleur incorrecte.

Cependant, parfois, vous voulez écrire sur des valeurs intermédiaires. Par exemple, si vous faites un rendu vers l'avant ou différé, vous rédigerez un éclairage accumulé dans un tampon à virgule flottante, puis utiliserez le mappage de tonalité HDR pour le résumer à une image [0, 1] pour l'affichage. Les techniques de post-traitement peuvent à nouveau être utilisées. Seules les sorties de [0, 1] doivent être à des images dans l'espace de couleurs SRGB.

Lorsque vous écrivez des valeurs RVB linéaires que vous souhaitez convertir en SRGB, vous devez activer GL_FRAMEBUFFER_SRGB. Il s'agit d'une activité spéciale (notez que les textures n'ont pas de moyen de désactiver le décodage SRGB) car parfois, vous voulez écrire des valeurs qui sont déjà dans SRGB. C'est souvent le cas pour les widgets d'interface GUI, qui ont été conçus et construits en utilisant déjà des couleurs dans l'espace de couleurs SRGB.

Je couvre les problèmes relatifs à Écriture de valeurs gamma correctes et les lire à partir de textures Dans ma série de tutoriels. Le premier explique pourquoi le gamma est important et fait explicitement la correction gamma dans le shader. Le deuxième lien couvre comment utiliser les images SRGB, à la fois dans les textures et les frameaux.

D'accord, et qu'en est-il des RenderBuffers? Le Doc ARB_FrameBuffer_SRGB ne mentionne rien des RenderBuffers.

Et pourquoi le ferait-il? Arb_framebuffer_srgb ne s'intéresse qu'à FrameBuffer et à la nature des images. Il ne sait ni ne se soucie d'où ces images viennent. Il ne se soucie pas s'il parle du FrameBuffer par défaut, d'une texture attachée à un FBO, d'un rendu attaché à un FBO, ou quelque chose de complètement nouveau que quelqu'un propose demain.

L'extension indique ce qui se passe lorsque l'image de destination est dans l'espace de couleurs SRGB et lorsque GL_FRAMEBUFFER_SRGB est autorisé. D'où vient cette image est à vous.

En outre, quelle est la différence entre GL_SRGB_ALPHA et GL_SRGB8_ALPHA8 lors de la spécification du format interne pour GLToxicage2d?

L'un est dimensionné. L'autre ne l'est pas. En théorie, GL_SRGB_ALPHA pourrait vous donner n'importe quel bitdepth l'implémentation recherchée. Cela pourrait vous donner 2 bits par composant. Vous donnez à la mise en œuvre la liberté de choisir ce qu'elle veut.

En pratique, je doute que vous trouverez une différence. Cela étant dit, toujours Formats internes de taille utilisée dans la mesure du possible. Il est bon d'être précis sur ce que vous voulez et d'empêcher la mise en œuvre de faire quelque chose de stupide. OpenGL a même des formats de taille requis pour être pris en charge explicitement comme indiqué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top