Rendre un SCNGeometry en fil de fer

J'utilise SceneKit sur iOS et j'ai une geometry que je veux rendre en fil de fer. Donc, fondamentalement, je veux dessiner seulement les lignes, donc pas de textures.

J'ai compris que je pourrais utiliser la propriété shaderModifiers du shaderModifiers utilisé pour accomplir ceci. Exemple de modificateur de shader:

 material.shaderModifiers = [ SCNShaderModifierEntryPointFragment: "_output.color.rgb = vec3(1.0) - _output.color.rgb;" ] 

Cet exemple inverse simplement les colors de sortie. Je ne sais rien de ce langage 'GLSL' que je dois utiliser pour le fragment de shader.

Quelqu'un peut-il me dire quel code je devrais utiliser comme fragment de shader pour ne dessiner que près des bords, pour que la geometry ressemble à un fil de fer?

Ou peut-être y a-t-il une autre approche pour rendre une geometry en fil de fer. J'aimerais l'entendre.

Maintenant, il est possible (au less dans Cocoa) avec:

 gameView.debugOptions.insert(SCNDebugOptions.ShowWireframe) 

ou vous pouvez le faire de manière interactive si vous activez les statistics avec:

 gameView.showsStatistics = true 

(gameView est une instance de SCNView )

Essayez de définir le matériau fillMode sur .lines (iOS 11+ et macOS 10.13+):

sphereNode.geometry?.firstMaterial?.fillMode = .lines

Ce n'est pas (tout à fait) une réponse, parce que c'est une question sans réponse facile.

Faire un rendu filaire entièrement dans le code shader est beaucoup plus difficile que cela ne devrait l'être, surtout sur les mobiles où vous n'avez pas de shaders de geometry. Le problème est que le vertex shader (et par la suite le fragment shader) n'a tout simplement pas l'information nécessaire pour savoir où se trouvent les bords du polygone.

Je ne sais rien de ce langage 'GLSL' que je dois utiliser pour le fragment de shader.

Si vous voulez vraiment résoudre ce problème, vous devrez en apprendre davantage sur GLSL (le langage d'ombrage OpenGL). Il y a beaucoup de livres et de tutoriels pour ça.

Une fois que vous avez un peu de GLSL sous la main, jetez un oeil à certaines des questions (comme celle-ci tirée de la barre latérale connexe ) et d' autres choses que les gens ont écrit sur le problème. (Notez que lorsque vous searchz des limitations spécifiques à un mobile, OpenGL ES a les mêmes limitations que WebGL sur le bureau.)

Avec SceneKit, vous avez l'inconvénient de ne pas avoir d'atsortingbut vertex barycensortingque ( SCNGeometrySource ) pour la geometry avec laquelle vous travaillez, et vous ne voulez probablement pas travailler dur pour en générer un. Dans OS X, vous pouvez utiliser un SCNProgram avec un geometryShader pour append des coordonnées barycensortingques avant que les shaders de sumts / fragments ne fonctionnent – mais vous devez faire votre propre ombrage (vous ne pouvez pas utiliser l'ombre SceneKit comme vous pouvez avec les shaders) ). Et ce n'est pas disponible dans iOS – le matériel là ne fait pas de shaders de geometry. Vous pourriez être en mesure de simuler à l'aide de coordonnées de texture si ceux-ci se trouvent dans votre geometry.


Il peut être plus simple de dessiner l'object en utilisant des lignes – essayez de créer un nouveau SCNGeometry partir des sources et des éléments de votre geometry (solide) d'origine, mais en recréant SCNGeometryElement , utilisez SCNPrimitiveTypeLine .