2017-10-05 5 views
2

Je suis assez novice lorsque je travaille avec la 3D, mais je ferai de mon mieux pour expliquer ma situation. J'importe quelques modèles (DAE de Maya) dans SceneKit (XCode 9) qui utilisent des matériaux semi-transparents. Dans ce cas précis, je me référerai à un modèle d'ampoule. Lorsque vous regardez le modèle tout droit, le filament à l'intérieur est visible à travers la couche extérieure en «verre». enter image description here Lorsque je fais pivoter le modèle le long de l'axe x, même légèrement, le filament disparaît. enter image description hereQu'est-ce qui fait que des parties de la géométrie SceneKit apparaissent et sortent sous des angles différents?

Je remarque ce comportement dans d'autres situations avec la géométrie contenue dans d'autres géométries avec des matériaux semi-transparents. J'utilise aussi l'éclairage à base physique. Est-ce que quelqu'un d'autre a rencontré cela? Merci d'avance.

Répondre

5

Dans la deuxième image, votre ampoule est grillée. Vous devriez aller à la quincaillerie et acheter une nouvelle ampoule.

Ok, sérieusement ...

La transparence dans le rendu 3D nécessite une attention particulière. Normalement, lorsque SceneKit (ou toute technologie graphique, en réalité) rend un objet opaque, il écrit deux sorties dans la cible de rendu: une pour la couleur et une pour la profondeur. Having depth information during the rendering process signifie que les objets opaques apparaissent correctement devant ou derrière les autres, quel que soit l'ordre dans lequel ils sont rendus, et permettent une optimisation des performances. Par exemple, si je dessine une théière, puis dessine un ensemble de tasses de thé autour de la théière, le GPU peut rapidement décider de garder les pixels de couleur de la théière ou les remplacer par des pixels des tasses en fonction de leur profondeur relative . (Et si le test de profondeur indique qu'il n'a pas besoin de certains de ces pixels, il n'a pas besoin de perdre du temps à les rendre

Si vous voulez que les pixels d'un objet se mélangent au-dessus d'un autre, vous rendez les choses opaques SceneKit a quelques astuces pour gérer l'ordre de rendu, mais dans votre cas, il y a une ride supplémentaire: vous avez une seule surface semi-transparente, donc les parties de la surface doivent être rendues devant les autres parties, et les parties dépendent de l'orientation par rapport à la caméra.Les frameworks de graphes de scène de haut niveau comme SceneKit ne sont généralement pas utiles, car ils rendent tous les triangles dans un maille à la fois, de sorte que vous ' Re coincé avec l'ordre dans lequel ils ont été définis, conduisant à des situations comme vous voyez sur la gauche dans l'image ci-dessous.

transparency modes from SceneKit WWDC17 talk

Cependant, SceneKit dans iOS 11 (et tvOS 11 et Mac OS 10.13 High Sierra, probablement watchos 4 aussi) a une solution. Jetez un oeil à la nouvelle transparency modes: si vous utilisez le paramètre dualLayer, SceneKit divise automatiquement une surface transparente en deux passes de rendu, une pour le dos et une autre pour l'avant. Non seulement cela s'assure-t-il que les triangles du maillage se mélangent correctement les uns par rapport aux autres, mais tout ce que vous mettez à l'intérieur de l'objet se fondra également correctement.

Ceci est bien expliqué in the WWDC17 talk on SceneKit here (d'où vient l'image ci-dessus).

Dans le cas de votre ampoule, vous devrez peut-être également vérifier la propriété writesToDepthBuffer sur certains matériaux.