Pourquoi OpenGL a-t-il un plan far-clipping, et quels sont les idiomes utilisés pour traiter cela?
J'ai appris L'OpenGL, et le seul sujet qui continue de me déconcerter est le plan de la coupure. Alors que je peux comprendre le raisonnement derrière le plan de coupure proche, et les plans de coupure latéraux (qui n'ont jamais aucun effet réel parce que les objets en dehors d'eux ne seraient jamais rendus de toute façon), le plan de coupure loin ne semble être qu'une nuisance.
puisque ceux qui sont derrière OpenGL ont évidemment réfléchi à tout cela, je sais qu'il doit y avoir quelque chose que je manque. Pourquoi ne OpenGL a un avion à couper le souffle? Plus important encore, parce que vous ne pouvez pas l'éteindre, quelles sont les idiomes et les pratiques recommandées pour dessiner des choses à de grandes distances (pour des objets tels que des étoiles à des milliers d'unités dans un jeu de l'espace, un skybox, etc.)? Est-ce que l'on s'attend à ce que le plan de coupe soit très éloigné, ou y a-t-il une solution plus élégante? Comment cela se fait-il dans les logiciels de production?
3 réponses
La seule raison est la profondeur de précision. Puisque vous n'avez qu'un nombre limité de bits dans le tampon de profondeur, vous pouvez aussi simplement représenter une quantité limitée de profondeur avec lui.
cependant, vous pouvez régler le plan lointain à l'infini: voir . Cela ne fonctionnera tout simplement pas très bien avec le tampon de profondeur - vous verrez beaucoup d'artefacts si vous avez une occlusion lointaine.
donc puisque cela tourne autour du tampon de profondeur, vous n'aurez pas de problème à traiter plus loin-loin des trucs, tant que vous ne l'utilisez pas. Par exemple, une technique courante est de rendre la scène en "plaques" qui n'utilisent chacune que le tampon de profondeur en interne (pour toutes les choses d'une même plaque) mais une certaine forme d'algorithme de peintre en externe (pour les plaques, donc vous dessinez le plus loin en premier)
pourquoi OpenGL a-t-il un avion de Far-clipping?
Parce que les ordinateurs sont fini.
Une alternative (si vous êtes prêt à avoir des objets au-delà d'une certaine distance échec à la profondeur-test correctement du tout) est de tourner sur le serrage de profondeur avec glEnable(GL_DEPTH_CLAMP)
. Cela empêchera de couper contre les plans proches et lointains; c'est juste que tout fragment qui aurait des coordonnées Z normalisées en dehors de la gamme [-1, 1] sera clampé à cette gamme. Comme indiqué précédemment, il bousille les tests de profondeur entre les fragments qui sont serrés, mais généralement ces objets sont loin.
C'est juste "le fait" qu' OpenGL
donc de mon point de vue c'est un des points de vue design de la bibliothèque OpenGL. Une approche pour éliminer cette extension OpenGL/OpenGL fonctionnalités de base https://www.opengl.org/registry/specs/ARB/depth_clamp.txt si il est disponible dans votre version OpenGL. je veux décrire que dans la projection en perspective il n'y a rien au sujet de "plan de découpage lointain". 3.1 Pour la projection en perspective vous devez configurer le point \ vec{C} comme centre de projection et le plan sur lequel la projection sera effectuée. Appelons ça de la
image plan t: (\vec{r}-\vec{r_0},\vec{n}) 3.2 supposons que le plan t projeté divise le point arbitaire \vec{r} et \vec{C} central de projection. Dans les autres cas, \vec{r} et \vec{c} se trouvent dans un même espace hafé et le point \vec{r} doit être écarté. 3,5 en l'état
(\vec{i} - \vec{r_0},\vec{n})=0 => ((1-t)\vec{c}+t\vec{r} - \vec{r_0},\vec{n})=0 => (\vec{c}+t (\vec{r} - \vec{c}) - \vec{r_0},\vec{n})=0 3.6. De "3.5" dérivé t peut être substitué dans "3.4" et vous recevrez la projection dans le plan T. 3.7. Après la projection, vous point sera couché dans l'avion. Mais si on suppose que le plan de l'image est parallèle au plan D'OXY, alors je peux suggérer d'utiliser la "profondeur" originale pour point après projection. donc du point de vue de la géométrie il est possible de ne pas utiliser le plan lointain du tout. Comme aussi de ne pas utiliser le modèle [-1,1]^3 explicitement du tout. p. S. Je ne sais pas comment taper correctement les formules latex façon, s.t. ils seront rendus.