Si vous faites une image en perspective et que votre modèle a des intersections implicites, si vous utilisez "Z linéaire", ces intersections apparaîtront aux mauvais endroits.
Par exemple, considérons un simple plan de masse avec une ligne de poteaux téléphoniques, s'éloignant au loin, qui transpercent le sol (et continuent ci-dessous). Les intersections implicites seront déterminées par les valeurs de profondeur interpolées. Si ceux-ci ne sont pas interpolés avec 1/Z
, alors lorsque les sommets projetés ont été calculés avec la perspective, l'image sera incorrecte.
Je m'excuse pour la qualité non esthétique des illustrations suivantes mais je les ai faites en 1997.
La première image montre l'effet de rendu requis. (Notez que les "pylônes" bleus vont assez loin sous le plan du sol et sont donc coupés au bas des images)
Cette deuxième image montre le résultat de l'utilisation d'un tampon de profondeur non réciproque: (Excuses pour le changement d'échelle - celles-ci ont été copiées à partir d'un ancien document MS Word et je n'ai aucune idée de ce qui s'est passé avec la mise à l'échelle.)
Comme vous pouvez le voir, les résultats sont incorrects.
Sur une autre note, êtes-vous sûr de vouloir vraiment une représentation Z linéaire? Si vous effectuez un rendu en perspective, on veut sûrement plus de précision plus près de la caméra qu'à distance?
Re votre commentaire ultérieur:
"Si ceux-ci ne sont pas interpolés avec 1 / Z" que je ne comprends pas. Quelle interpolation est-ce?
La première chose à noter est qu'avec une projection en perspective standard, les lignes droites dans l'espace mondial restent des lignes droites dans l'espace en perspective. Les distances / longueurs ne sont cependant pas conservées.
Pour simplifier, supposons qu'une transformation de perspective triviale est utilisée pour projeter les sommets, c'est-à-dire
Nous devons également calculer une profondeur d'espace d'écran réciproque, par exemple mais le Z linéaire dans le tampon de profondeur nécessiterait, selon moi, quelque chose comme: (On peut supposer ici que scale = 1)XSc r e e n=XWo r l dZWo r l d
OuiSc r e e n=OuiWo r l dZWo r l d
ZSc r e e n=1ZWo r l d
ZSc r e e n= s c a l e ∗ZWo r l d
Supposons que nous ayons une ligne avec les points d'extrémité de l'espace mondial
Avec la mise en perspective de ces cartes sur les coordonnées de l'espace d'écran
⎡⎣⎢001⎤⎦⎥a n d⎡⎣⎢2000dix⎤⎦⎥
⎡⎣⎢001⎤⎦⎥a n d⎡⎣⎢2000,1⎤⎦⎥
Le système / matériel de rendu interpolera linéairement l'espace d'écran z, donc au point 1/2 de la ligne, tel qu'il apparaît à l'écran, c'est-à-dire au pixel (10, 0), nous obtiendrions un Z inverse (projeté) 0,55, ce qui correspond à une valeur Z de l'espace mondial de ~ 1,818. Étant donné les valeurs Z de début et de fin, cela représente environ 20% le long de la ligne.
Si à la place, nous essayions d'interpoler en utilisant les valeurs Z d'origine, nous nous retrouverions avec Z correspondant à une valeur d'espace mondial de 5,5. Tant que rien ne se croise, vous pouvez être d'accord (je n'y ai pas trop réfléchi) mais tout ce qui a des intersections implicites sera incorrect.
Ce que je n'ai pas mentionné, c'est qu'une fois que vous avez introduit une texturation correcte en perspective (ou même un ombrage correct en perspective), vous devez effectuer une interpolation par pixel de 1 / w et, en outre, calculer également, par pixel, l'inverse de cette valeur interpolée.
far / z
, qui est standard, n'a pas de sens. Il produit un tampon de profondeur qui devient plus linéaire plus les deux plans de clip sont proches l'un de l'autre. Cela ressemble à une fusion de deux concepts: un écran espace linéaire Z et un mappage de tampon de profondeur non constant pour un hack de performance.