2015-09-17 2 views
3

J'ai fait un peu de recherche, mais les seuls résultats que j'ai trouvés ont pris en compte l'anti-aliasing et la mécanique derrière.Puis-je utiliser un tampon multi-échantillons pour d'autres choses que l'anti-crénelage?

Je souhaite utiliser un tampon multi-échantillons pour d'autres choses que l'anti-aliasing. Spécifiquement, je pense à une forme de transparence indépendante de l'ordre, en stockant une valeur de couleur et de profondeur différente dans chaque échantillon (idéalement les N fragments les plus proches de la caméra).

Est-ce encore possible en premier lieu? A-t-il déjà été fait, et si oui, comment? Même si c'était possible, est-ce que la mémoire est plus efficace que de simplement allouer un autre N framebuffers?

Si quelque chose comme ceci nécessite un shader de calcul ou OpenCL, c'est bien, je suis juste curieux de voir si c'est possible en premier lieu.

Cette question n'est pas spécifique à OpenGL ou DirectX, car le matériel serait le même dans les deux cas.

PS. S'il vous plaît ne me pointez pas seulement vers d'autres méthodes de transparence indépendantes de l'ordre, cette question est spécifiquement de savoir si le tampon multisample peut être utilisé pour des moyens atypiques.

+0

Je ne pense pas, sauf si vous pouvez programmer le rasterizer. C'est peut-être possible avec DX12 mais je n'en ai aucune idée. Cela pourrait le rendre disponible pour une utilisation non anti-aliasing. Mais votre idée semble toujours impossible. –

+0

Je ne l'ai jamais essayé moi-même, mais à partir d'OpenGL 4.0, on peut définir le masque d'échantillon à partir du fragment shader en utilisant la variable 'gl_SampleMask' [(référence)] (https://www.opengl.org/wiki/Built-in_Variable_ (GLSL) #Fragment_shader_outputs). – BDL

+0

Idée intéressante, mais je ne vois pas cela fonctionner de quelque façon que ce soit. Même avec 'gl_SampleMask' de @BDL, les bords des triangles ne peuvent pas être gérés correctement, car vous ne pouvez pas écrire sur des pixels qui ne sont pas couverts par la primitive. Par exemple, lorsque vous utilisez le multi-échantillonnage 2x2 et que votre primitive couvre 3 des 4 sous-pixels, le 4ème sous-pixel ne peut pas être écrit. – dari

Répondre

1

Le gros problème est que le système est codé en dur pour utiliser le multi-échantillonnage pour, bien, multi-échantillonnage, pas pour le stockage de données arbitraires. Grâce à l'utilisation de gl_SampleMask output, vous pouvez diriger les résultats d'un fragment shader vers un échantillon spécifique du tampon multisample. Vous pouvez ensuite utiliser un shader pour effectuer une résolution multisample personnalisée afin de faire votre tri de transparence ou tout ce que vous avez l'intention de faire ici.

En théorie, bien sûr. En pratique cependant, gl_SampleMask sera logiquement et édité avec le masque d'échantillon calculé par le rasterizer pour ce fragment. Donc, si vous définissez gl_SampleMask pour écrire sur un échantillon particulier qui n'est pas couvert par votre fragment, rien n'est écrit.

Vous ne pouvez rien y faire. Même l'activation explicite d'une évaluation par shader de fragment par échantillon ne vous aidera pas, puisque le système calculera et utilisera toujours ce masque, en fonction de la géométrie avec laquelle vous effectuez le rendu. En règle générale, non, il n'y a pas grand-chose que vous pouvez utiliser pour le multi-échantillonnage en plus de l'anti-crénelage.