Three.js: Le décalage/répétition UV doit faire partie des matériaux plutÎt que des textures

CrĂ©Ă© le 10 janv. 2015  Â·  73Commentaires  Â·  Source: mrdoob/three.js

Le dĂ©calage UV et la rĂ©pĂ©tition (et probablement certaines des autres propriĂ©tĂ©s de texture) sont des uniformes qui sont Ă©trangement transmis de la texture au matĂ©riau, ce qui entraĂźne des problĂšmes oĂč vous devez cloner des textures par matĂ©riau (perte une tonne de mĂ©moire) si vous voulez par - dĂ©calages/rĂ©pĂ©titions de matĂ©riaux, ou roulez votre propre shader personnalisĂ©. Il est trĂšs inefficace de forcer les gens Ă  faire cela, le meilleur des cas Ă©tant si quelqu'un veut carreler une texture sur une surface en fonction de la taille de l'objet auquel elle est appliquĂ©e, ou utiliser une texture comme feuille de sprite pour les animations. Je ne peux voir le systĂšme actuel que comme un obstacle sans rĂ©el avantage, car la probabilitĂ© d'avoir besoin de dĂ©calages / rĂ©pĂ©titions UV partagĂ©s sur une texture "partagĂ©e" est faible et serait normalement mieux servie en partageant un matĂ©riau. Dans tous les cas, mettre Ă  jour les uniformes hors de la texture est Ă©trange, car cela n'a vraiment rien Ă  voir avec la texture et finit par ĂȘtre dĂ©routant pour l'utilisateur final. Par exemple, changer le dĂ©calage/rĂ©pĂ©tition lorsque plus d'une map est appliquĂ©e au matĂ©riau, par exemple diffus+normalmap, n'utilise que le dĂ©calage/rĂ©pĂ©tition de la map diffuse, donc la valeur du dĂ©calage/rĂ©pĂ©tition des normalmaps est complĂštement inutile dans ce contexte , quand cela suggĂšre vraiment que cela devrait affecter le dĂ©calage/rĂ©pĂ©tition de la carte normale. Tout est confus.

Je suis presque sĂ»r que le changement est requis dans la fonction "refreshUniformsCommon", mais il y a probablement plus que cela. Il y a aussi quelques changements requis dans le plugin sprite. Cela casserait probablement beaucoup de projets de personnes, mais c'est une assez grosse incohĂ©rence dans l'API texture/matĂ©riau. Ce serait peut-ĂȘtre une meilleure idĂ©e d'en faire un remplacement qui est normalement nul pour les matĂ©riaux, et lorsqu'il est dĂ©fini, il ignore les valeurs dans les textures, afin de ne pas casser les choses de tout le monde.

Suggestion

Commentaire le plus utile

ce fil est TL; DR pour moi. mais je viens de découvrir ce code en r68 (ancien projet, oui):

        // uv repeat and offset setting priorities
        //  1. color map
        //  2. specular map
        //  3. normal map
        //  4. bump map
        //  5. alpha map

        var uvScaleMap;

        if ( material.map ) {

            uvScaleMap = material.map;

        } else if ( material.specularMap ) {

            uvScaleMap = material.specularMap;

        } else if ( material.normalMap ) {

            uvScaleMap = material.normalMap;

        } else if ( material.bumpMap ) {

            uvScaleMap = material.bumpMap;

        } else if ( material.alphaMap ) {

            uvScaleMap = material.alphaMap;

        }

        if ( uvScaleMap !== undefined ) {

            var offset = uvScaleMap.offset;
            var repeat = uvScaleMap.repeat;

            uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );

        }

Donc voilĂ ...

si vous allez proposer un changement fondamental à la bibliothÚque, comme celui que vous avez proposé ici, vous devez fournir un argument clair et convaincant pour ce changement

J'essayais de définir une répétition différente sur les cartes diffuses et normales et je m'arrachais les cheveux parce que cela ne fonctionnait pas. puisque l'API place ce paramÚtre dans la texture, je pensais pouvoir le faire. alors oui, que diriez-vous de garder mes cheveux pour un argument convaincant ? ce ticket est toujours ouvert, 3js a toujours ce paramÚtre sur les textures, et il n'est respecté que pour l'une des textures = c'est, en effet, déjà le paramÚtre EST par matiÚre.

Si vous n'allez pas déplacer cela à sa place, dites au moins que cela n'a aucun effet dans les documents ?

Tous les 73 commentaires

Article connexe : https://github.com/mrdoob/three.js/issues/3549

vous devez cloner les textures par matériau (perdre une tonne de mémoire)

Dans quel sens des tonnes de mémoire sont-elles gaspillées ?

la probabilité d'avoir besoin de décalages/répétitions UV partagés sur une texture "partagée" est faible

Que veux-tu dire par lĂ ?

Si nous gardons l'approche actuelle, une chose qui doit ĂȘtre modifiĂ©e, c'est que lorsqu'une texture est clonĂ©e, l'image partagĂ©e ne doit ĂȘtre transmise au GPU qu'une seule fois.

si vous avez un objet avec un grand nombre de cadres/feuilles, de nombreux objets inutiles sont crĂ©Ă©s et, comme vous l'avez dit, l'image est copiĂ©e plusieurs fois sur le GPU, ce qui est extrĂȘmement inutile. Encore plus inutile, si vous avez plusieurs objets qui doivent ĂȘtre Ă  diffĂ©rents points dans diffĂ©rentes animations, vous devrez crĂ©er un ensemble unique de textures par matĂ©riau/objet unique, donc cela devient rapidement ennuyeux Ă  manipuler, oĂč un uniforme de matĂ©riau pourrait beaucoup plus facilement ĂȘtre manipulĂ© sans avoir ces structures de donnĂ©es de dĂ©calage/rĂ©pĂ©tition de texture supplĂ©mentaires construites autour d'une API mal pensĂ©e juste pour le faire fonctionner. J'ai un ralentissement majeur dans un certain cas d'utilisation de mon application oĂč je dois crĂ©er ces groupes de textures uniques partout, et j'ai l'impression que la seule solution serait de remplacer tous les matĂ©riaux de base que j'utilise avec des shadermaterials pour contourner ce problĂšme unique, ou bien bifurquer ma version THREE.js et faire les modifications nĂ©cessaires.

Concernant la deuxiĂšme affirmation :

Je voulais dire que le paradigme actuel ne facilite le travail que dans les cas oĂč vous souhaitez appliquer la mĂȘme texture avec le mĂȘme dĂ©calage/rĂ©pĂ©tition UV, mais c'est gĂ©nĂ©ralement un cas rare, car il semble beaucoup plus probable que vous vouliez dĂ©finir cela comme les autres uniformes, par matĂ©riau, et partagent un matĂ©riau plutĂŽt que simplement la texture.

La principale mise en garde avec le sys actuel. est que le dĂ©calage/rĂ©pĂ©tition n'existe vraiment qu'en tant qu'uniforme unique qui affecte toutes les textures du shader, mais le fait qu'il soit attachĂ© Ă  THREE.Texture signifie qu'il ne peut pas ĂȘtre utilisĂ© correctement comme uniforme et trompe les gens en leur faisant croire que les dĂ©calages/rĂ©pĂ©titions peuvent ĂȘtre choisis diffĂ©remment pour les diffĂ©rentes textures qui peuvent ĂȘtre appliquĂ©es sur les matĂ©riaux de base (c'est-Ă -dire que vous pouvez dĂ©finir un dĂ©calage diffus et un dĂ©calage normal de carte diffĂ©rents, mais ce n'est pas rĂ©ellement possible mĂȘme s'ils peuvent ĂȘtre dĂ©finis uniquement sur les diffĂ©rentes textures). Je peux voir qu'il s'agissait peut-ĂȘtre d'un vestige du moteur de rendu canvas, mais cela n'a tout simplement aucun sens avec le systĂšme de matĂ©riel webGLrender / GLSL, qui l'a largement usurpĂ©.

mrdoob a dĂ©clarĂ© qu'il devrait ĂȘtre de la forme suivante comme raison de ne pas l'avoir par matĂ©riau,

material.map
material.mapOffset
material.mapRepeat
matériel.env
material.envOffset
material.envRepeat
... etc.

mais encore une fois, le dĂ©calage / rĂ©pĂ©tition ne fonctionne pas par type de carte mĂȘme maintenant, ce n'est donc pas vraiment un argument valide. De toute façon, cela gaspillerait trop d'uniformes de l'avoir par type de carte (sans compter que vous n'utilisez gĂ©nĂ©ralement qu'un seul ensemble d'UV, vous n'auriez donc pas vraiment plusieurs dĂ©calages pour une normalmap / bumpmap / diffusemap / specularmap). Je pense que si vous pesez toutes les options raisonnablement, cela devrait vraiment ĂȘtre une propriĂ©tĂ© matĂ©rielle plutĂŽt qu'une propriĂ©tĂ© de texture. Je ne pense vraiment pas qu'il y ait d'avantages au systĂšme actuel. Je pense que l'animation de matĂ©riaux via le dĂ©calage UV est une raison majeure d'avoir mĂȘme la propriĂ©tĂ©, et ne peut mĂȘme pas ĂȘtre correctement utilisĂ©e pour cela. Sans compter que si vous n'aviez pas besoin de ces uniformes, ils pourraient ĂȘtre omis de la compilation des shaders, alors qu'ils sont maintenant lĂ  tant qu'une carte l'est.

@QuaziKb Avec tout le respect que je vous dois, si vous proposez un changement fondamental à la bibliothÚque, comme celui que vous avez proposé ici, vous devez fournir un argument clair et convaincant pour ce changement. Argumenter à partir du cadre de référence de votre application particuliÚre ne va pas le couper.

Cela étant dit, moi aussi, j'aimerais voir le décalage/répétition déplacé de Texture vers les matériaux.

Je pense qu'il est raisonnable de supposer que les cartes suivantes ont les mĂȘmes valeurs de dĂ©calage/rĂ©pĂ©tition :

specularMap
normalMap
bumpMap
alphaMap
aoMap (future)
glossMap (future)
displacementMap (future)

La seule exception est


C'est la façon dont il est mis en Ɠuvre maintenant; mĂȘme si chaque carte a ses propres valeurs de dĂ©calage/rĂ©pĂ©tition, elles ne sont pas respectĂ©es.

Ainsi, nous pourrions ajouter Ă  MeshPhongMaterial , MeshLambertMaterial , MeshBasicMaterial , et SpriteMaterial , nous ajouterions

mapOffset // or mapTranslate
mapRepeat // or mapScale

Nous supprimerions offset et repeat de Texture .

De cette façon, la mise en Ɠuvre d'une feuille de sprites est simple. Chaque sprite a un matĂ©riau, et ces matĂ©riaux partagent une seule texture. La texture a une image. La texture n'a plus besoin d'ĂȘtre clonĂ©e. CĂŽtĂ© GPU, les matĂ©riaux partageraient un seul programme de shader.

À mon humble avis, il s'agit d'une API plus naturelle.

J'essaie de me rappeler pourquoi l'API a été implémentée de cette façon. Je suppose qu'il y avait une bonne raison.

DĂ©solĂ©, je ne voulais pas suggĂ©rer que c'Ă©tait particulier Ă  mon exemple, simplement que l'API actuelle entraĂźne un gonflement important lorsqu'elle est utilisĂ©e pour animer des feuilles / dĂ©calages de sprites par objet / matĂ©riau unique, sans vĂ©ritable solution. Naturellement, le but principal de l'avoir comme uniforme plutĂŽt que de simplement intĂ©grer le dĂ©calage/rĂ©pĂ©tition dans les UV de sommet du modĂšle est d'animer le dĂ©calage, et je suggĂ©rais que cela ne peut pas ĂȘtre fait sans contourner l'API, rendant l'uniforme beaucoup moins utile attachĂ© aux textures que s'il l'Ă©tait Ă  la matiĂšre.

Je pense qu'il est raisonnable de supposer que les cartes suivantes ont les mĂȘmes valeurs de dĂ©calage/rĂ©pĂ©tition :
carte
...
alphaMap

FWIW, ce comportement (l'implĂ©mentation actuelle) me cause une frustration importante en ce moment mĂȘme. J'essaie d'animer la rĂ©vĂ©lation d'un maillage en interpolant le dĂ©calage alphaMap du matĂ©riau du maillage indĂ©pendamment de sa map diffuse (qui reste fixe). AprĂšs une certaine frustration, j'ai dĂ©couvert via https://github.com/mrdoob/three.js/pull/4987 et ce bug que ce n'est pas possible.

@jcarpenter Quel est le "bug"

Correction : par "bug" je voulais dire ce problÚme. Une confusion due à un temps excessif dans une culture Bugzilla. :p Je comprends que ce n'est pas un bogue, mais plutÎt le comportement prévu.

WRT à une amélioration, sur la base de mon expérience avec les applications de création de contenu 3D traditionnelles comme Cinema 4D, j'imagine que l'utilisateur peut à la fois :

  • dĂ©finir un dĂ©calage/Ă©chelle/rĂ©pĂ©tition pour chaque texture dans un matĂ©riau, indĂ©pendamment des autres textures, _et_
  • dĂ©finir le dĂ©calage/l'Ă©chelle/la rĂ©pĂ©tition du matĂ©riau parent

Alternativement, pour le cas d'utilisation sur lequel je travaille ("tenter d'animer la rĂ©vĂ©lation d'un maillage"), ce serait fantastique d'avoir une option pour wrapS et wrapT qui ne s'enroule pas du tout. Selon le GIF ci-joint de Cinema4D, qui a une option pour dĂ©sactiver entiĂšrement la mosaĂŻque pour le mappage UVW. Sur la base de tests assez approfondis avec les mĂ©thodes wrapS et wrapT existantes, rien de tel n'est possible. Ce qui signifie que mes options pour animer la rĂ©vĂ©lation d'Ă©lĂ©ments dans three.js semblent limitĂ©es Ă  la position d'interpolation et Ă  l'opacitĂ© de l'ensemble du maillage ... À moins que quelque chose ne me manque.

c4d-tile-2

D'accord. Le but est de simplifier tout cela (en utilisant une seule matrice3 dans le shader) et d'avoir un décalage/répétition (ou translation/échelle) par texture.

Toute personne qui veut aider avec cela serait trÚs appréciée!

@jcharpentier

Malheureusement, la seule façon de le faire pour le moment est d'utiliser plusieurs maillages avec différents matériaux ou un matériau de shader personnalisé. Les deux sont en quelque sorte impliqués pour un utilisateur qui vient de sauter dans le flux de travail three.js.

Il y a un compromis constant entre la convivialitĂ©, les performances et l'extensibilitĂ©. Ma suggestion serait de rĂ©Ă©crire la façon dont les textures et les matĂ©riaux fonctionnent actuellement dans l'api, de sorte que les textures soient strictement des paramĂštres que vous branchez, et les valeurs qui sont en fait uniformes dans le shader comme le mode dĂ©calage/rĂ©pĂ©tition/enroulement soient spĂ©cifiquement liĂ©es au MatĂ©riel. Dans certains cas, vous ne voulez pas gaspiller un uniforme Ă  contrĂŽler les UV pour des textures qui n'ont jamais besoin de changer (ce serait un Ă©norme gaspillage d'avoir 4 * 5 uniformes supplĂ©mentaires dans un matĂ©riau phong si vous n'en avez besoin que pour la diffusion), donc ce serait cool s'il y avait de la magie dans les coulisses qui dĂ©tecte si des UV spĂ©cifiques sont nĂ©cessaires et que la texture est reconstruite pour rĂ©pondre Ă  ces demandes, ou si un paramĂštre pouvait Ă©ventuellement ĂȘtre transmis pour spĂ©cifier le nombre d'UV rĂ©glables requis et quoi cartes qu'ils compensent et comment, mais c'est un problĂšme difficile Ă  rĂ©soudre.

Le but est de simplifier tout cela (en utilisant une seule matrice3 dans le shader) et d'avoir un décalage/répétition (ou translation/échelle) par texture.

@mrdoob

  1. Voulez-vous dire _per material.map_ donc la transformation de texture est dans le matĂ©riau ? Il y a beaucoup de cartes matĂ©rielles, malheureusement. Nous pourrions continuer Ă  supposer que toutes les transformations de texture sont les mĂȘmes, Ă  l'exception de lightmap.
  2. Souhaitez-vous également soutenir la rotation ? Si c'est le cas, vous devez également ajouter le centre de rotation -- à moins que vous ne vouliez lier le centre de rotation au centre de la texture.

Ce serait un changement trÚs apprécié. Devoir cloner des textures juste pour les mettre à des valeurs de répétition uniques semble terriblement encombrant. Est-ce ainsi que procÚdent les autres bibliothÚques ?

  1. Voulez-vous dire _per material.map_ donc la transformation de texture est dans le matĂ©riau ? Il y a beaucoup de cartes matĂ©rielles, malheureusement. Nous pourrions continuer Ă  supposer que toutes les transformations de texture sont les mĂȘmes, Ă  l'exception de lightmap.

Je pense que nous devrions avoir un mat3 par carte et devrait ĂȘtre composĂ© des propriĂ©tĂ©s Texture .

  1. Souhaitez-vous également soutenir la rotation ? Si c'est le cas, vous devez également ajouter le centre de rotation -- à moins que vous ne vouliez lier le centre de rotation au centre de la texture.

Rotation oui. Centrer ou pas... Je ne sais pas, mais pour autant que je sache, tout cela peut ĂȘtre encodĂ© dans un seul mat3 pour le shader (par map).

Voici un prototype montrant comment un Matrix3 peut ĂȘtre passĂ© Ă  un shader et reprĂ©senter une transformation dĂ©finie par offsetX , offsetY , repeatX , repeatY , rotation , rotationCenterX et rotationCenterY .

Si center n'est pas autorisĂ© comme option, alors il doit ĂȘtre cĂąblĂ© Ă  ( 0.5, 0.5 ) .

Commentaires bienvenus.

EDIT : démo mise à jour

rotateuvs

C'EST BIEN! :+1: :+1:

Je pense que j'irais avec translation et scale (au lieu de offset et repeat ) cependant.

Quelles devraient ĂȘtre exactement les nouvelles propriĂ©tĂ©s du matĂ©riau ? Il existe de nombreuses cartes matĂ©rielles.

Que faut-il supprimer des propriétés de la texture ?

Je suppose que wrapS/T devrait rester sur la texture.

Je pense que texture.offset et texture.repeat devraient ĂȘtre supprimĂ©s.

Je pense que les nouvelles propriĂ©tĂ©s devraient ĂȘtre... texture.translation , texture.rotation , texture.scale , texture.center et texture.matrix . Nous aurons probablement aussi besoin d'une mĂ©thode texture.updateMatrix() qui serait appelĂ©e au moment du rendu. Ceci, bien sĂ»r, a le dĂ©fi de s'assurer que nous ne le faisons qu'une seule fois, mĂȘme si la texture est rĂ©utilisĂ©e.

En se référant au titre de cet article et aux arguments de https://github.com/mrdoob/three.js/issues/5876#issuecomment -69483293, je pensais qu'il s'agissait de déplacer ces propriétés vers le matériau.

/ping @bhouston pour les commentaires.

Mes pensĂ©es sont que le dĂ©calage/rĂ©pĂ©tition de texture devrait ĂȘtre cuit dans les UV autant que possible. C'est plus facile. C'est ainsi que procĂšdent UE4/Unity 5 pour la plupart.

L'exception est que Unity 5 a la possibilitĂ© de spĂ©cifier un dĂ©calage/rĂ©pĂ©tition global par matĂ©riau qui est partagĂ© entre toutes les textures - mais cela n'affecte pas ce qui sont considĂ©rĂ©s comme des cartes ancrĂ©es telles que les cartes lightMap ou ambientOcclusion (celles n'a pas de sens d'ĂȘtre ajustĂ©.)

La raison pour laquelle je ne préconise pas beaucoup de flexibilité ici est que les modÚles créés par des professionnels ont des UV appropriés qui rendent cela généralement inutile - les outils de création de contenu ont des moyens de le faire. L'autre problÚme est que WebGL a une limite inférieure ridiculement basse pour les uniformes fragmentés - 16 Vec4. Si vous devez avoir une répétition/décalage par carte, et que nous obtiendrons bientÎt beaucoup de cartes, nous gaspillons des uniformes fragmentés pour trÚs peu de valeur.

En fait, j'ai récemment ajouté des commandes de répétition/décalage, puis de luminosité/gain par texture dans Clara.io et j'annulerai ces modifications car cela entraßne un débordement des uniformes de fragments sur les appareils bas de gamme, tels que tous les appareils Apple iOS. Bien que la répétition/le décalage et la luminosité/le gain fonctionnent trÚs bien sur les ordinateurs de bureau avec NVIDIA 980, mais nous devons concevoir pour tout le monde, pas pour les machines haut de gamme. ;)

Nous devons traiter les uniformes fragmentés avec respect et ne les utiliser que lorsque cela est nécessaire. Je crois que ce n'est pas un de ces cas.

L'exception est que Unity 5 a la possibilité de spécifier un décalage/répétition global par matériau

C'est essentiellement ce que fait three.js maintenant - bien qu'il obtienne le décalage/répétition de la carte diffuse, et que toutes les autres textures matérielles utilisent le paramÚtre de cette carte.

La proposition consiste Ă  supprimer le dĂ©calage/rĂ©pĂ©tition de la texture et Ă  l'ajouter au matĂ©riau Ă  la place - avec peut-ĂȘtre un changement de nom. Encore une fois, toutes les textures matĂ©rielles partageraient les mĂȘmes paramĂštres (mĂȘme si certains utilisateurs ne seraient pas satisfaits). Cela permettrait de maintenir une utilisation uniforme faible.

Malheureusement, nous n'obtenons pas beaucoup de consensus Ă  ce sujet.

Faire ce que fait Unity 5 est une bonne idée. Je le mettrais aussi sur le matériau au lieu de la texture. Vous avez mon soutien.

Par carte n'est pas vraiment idĂ©al, mais cela pourrait ĂȘtre rĂ©solu en le faisant spĂ©cifier avec des drapeaux/clĂ©s d'une maniĂšre ou d'une autre lorsque les matĂ©riaux sont construits, au cas oĂč cela serait nĂ©cessaire.

Généralement, la seule raison de modifier les UV dans le shader est que vous voulez les animer. Si vous souhaitez simplement transformer les UV de maniÚre statique, nous ne devrions pas modifier le shader pour ajouter cette fonctionnalité.

Le seul changement proposé au shader est de remplacer

vUv = uv * offsetRepeat.zw + offsetRepeat.xy;

avec

vUv = ( uvTransform * vec3( uv, 1 ) ).xy;

D'accord. Que diriez-vous de ceci... Nous ajoutons texture.dynamic ( false par défaut) ce qui produit :

vUV = uv;

Si l'utilisateur définit texture.dynamic à true alors nous calculons texture.matrix sur texture.translation , texture.rotation , texture.scale et texture.center , on passe ça au programa et on produit :

vUv = ( uvTransform * vec3( uv, 1 ) ).xy;

Bien sûr, si texture.dynamic change, nous devons recompiler le programme.

De cette façon, nous obtenons le meilleur des deux mondes?

@mrdoob

  1. Selon vous, est-ce que scale une propriété de la texture ou est-ce que texture.scale une propriété du matériau ? J'espÚre qu'il s'agit de ce dernier, car c'est de cela que traite ce fil.
  2. Nous n'avons pas besoin d'une propriété .matrix . Le nouveau Matrix3 est un uniforme qui remplace l'uniforme matériel offsetRepeat . Il est calculé à partir des autres paramÚtres du moteur de rendu et transmis au GPU comme n'importe quel autre uniforme.
  1. Selon vous, est-ce que scale une propriété de la texture ou est-ce que texture.scale une propriété du matériau ? J'espÚre qu'il s'agit de ce dernier, car c'est de cela que traite ce fil.

Je ne suis pas d'accord avec ce fil. Je ne pense pas que nous devrions polluer les matĂ©riaux avec mapMatrix , envMapMatrix , ... Ni mapTranslation , mapRotation , mapScale . Je pense que c'est plus propre si THREE.Texture a translation , rotation , scale et, peut-ĂȘtre center .

  1. Nous n'avons pas besoin d'une propriété .matrix . Le nouveau Matrix3 est un uniforme qui remplace l'uniforme matériel offsetRepeat . Il est calculé à partir des autres paramÚtres du moteur de rendu et transmis au GPU comme n'importe quel autre uniforme.

Nous avons en quelque sorte besoin de quelque chose comme ça. Disons que l'on rĂ©utilise la mĂȘme texture dans diffĂ©rentes maps. Nous ne voulons pas calculer le Matrix3 pour chaque instance.

Je ne suis pas d'accord avec ce fil. Je ne pense pas qu'il faille polluer les matĂ©riaux avec mapMatrix, envMapMatrix, ... Ni mapTranslation, mapRotation, mapScale. Je pense que c'est plus propre si THREE.Texture a une traduction, une rotation, une Ă©chelle et peut-ĂȘtre un centre.

Une texture aurait-elle encore besoin d'ĂȘtre clonĂ©e pour avoir des propriĂ©tĂ©s de rĂ©pĂ©tition diffĂ©rentes ? Dans les petites scĂšnes, ce n'est probablement pas grave, mais dans les grandes scĂšnes oĂč il y a dĂ©jĂ  plus de 40 textures, c'est un cauchemar de mĂ©moire.

@titansoftime image doit ĂȘtre dĂ©couplĂ© de THREE.Texture . IdĂ©alement, un seul THREE.Image pourrait ĂȘtre utilisĂ© par diffĂ©rents THREE.Texture chacun avec diffĂ©rentes translation , rotation , ... configurations.

L' image

Ça a du sens. Est-ce que texture.clone() fonctionne dĂ©jĂ  de cette façon, ou doit-il ĂȘtre configurĂ© manuellement ?

texture.clone() fonctionne de cette façon, mais WebGLRenderer est incapable de savoir que l'image est la mĂȘme, donc c'est lĂ  que le tĂ©lĂ©chargement de la texture est inutile...

Je ne suis pas d'accord avec ce fil. Je ne pense pas qu'il faille polluer les matĂ©riaux avec mapMatrix, envMapMatrix, ... Ni mapTranslation, mapRotation, mapScale. Je pense que c'est plus propre si THREE.Texture a une traduction, une rotation, une Ă©chelle et peut-ĂȘtre un centre.

C'est essentiellement ce que nous faisons maintenant. Chaque texture a sa propre propriĂ©tĂ© offset et les dĂ©calages individuels ne sont pas respectĂ©s -- le moteur de rendu utilise le mĂȘme dĂ©calage pour chaque texture du matĂ©riau.

FWIW, je pense que nous devrions faire ce que j'ai dit dans https://github.com/mrdoob/three.js/issues/5876#issuecomment -69483293 .

Je ne vois pas pourquoi l'API ne peut pas permettre de faire ce que @jcarpenter veut faire (animer le dĂ©calage du alphaMap , alors que map reste le mĂȘme). On pourrait le faire dans canvas, mais je pense que c'est plutĂŽt une tĂąche pour le GPU.

Il y a une tonne de choses que l'on peut faire en jouant avec les décalages de différentes cartes... décaler uniquement le alphaMap , mettre à l'échelle le normalMap , etc.

N'avoir qu'un seul uvTransform par matériau semble trÚs trÚs limitatif.

Oh, attendez. Je pense que je comprends pourquoi vous préférez par matériau. De cette façon, un seul vUv est calculé dans le vertex shader, au lieu de calculer l'uv par pixel dans le fragment shader. Droit?

par matĂ©riau est idĂ©al car les dĂ©calages sont en fait simplement mis en Ɠuvre Ă  l'aide d'un uniforme du matĂ©riau et n'ont rien Ă  voir avec la texture, nous nous retrouvons donc avec une solution de contournement absurde si nous devons modifier l'uniforme par matĂ©riau qui doit ĂȘtre fabriquĂ© des tonnes de nouveaux objets/textures (ce qui est assez mauvais en JS/terrible en WebGL) juste pour contrĂŽler quelque chose qui n'est en rĂ©alitĂ© qu'une caractĂ©ristique des uniformes matĂ©riels qui sont cachĂ©s aux utilisateurs. L'avoir dans une texture n'est en aucun cas avantageux, plus efficace ou mĂȘme plus clair, et cela signifie que la seule application rĂ©elle de spĂ©cifier les UV qui changent au moment de l'exĂ©cution, l'animation, est rendue lente et inefficace Ă  cause de l'API.

Les textures doivent spĂ©cifier une image et tout ce qui se rapporte Ă  cette image. Les dĂ©calages UV n'ont rien Ă  voir avec les propriĂ©tĂ©s de l'image / de l'image, et tout Ă  voir avec le matĂ©riau affichant la texture, il est absurde d'avoir mĂȘme cette fonctionnalitĂ© si elle ne fait pas partie du matĂ©riau, car il doit y avoir des tonnes de clonage en cours par exemple, et la mise Ă  jour de plusieurs textures simultanĂ©ment si l'on veut rĂ©ellement utiliser la fonctionnalitĂ© dans de nombreux cas.

imaginez que l'on a une image différente pour chaque image d'une tuile animée et que vous vouliez également contrÎler le décalage/la répétition de cette tuile. Ils devraient mettre à jour chaque image entrante avec les décalages, ainsi que des copies de chaque image pour chaque instance unique de matériau utilisant cette tuile, cela se transforme rapidement en centaines de nouveaux objets et affectations supplémentaires, pour quelque chose qui ne fait que contrÎler quelques chars par matériau dans les coulisses utilisant tous ces objets sans raison valable.

en ce qui concerne les transformations par carte, mĂȘme si ce serait bien, le coĂ»t uniforme est trop Ă©levĂ© sans raison dans la plupart des cas, sauf si nous avons une API complexe pour contrĂŽler quand et comment les transformations doivent ĂȘtre uniques ou partagĂ©es ou dynamiques, IMO avoir ce contrĂŽle serait une bonne chose, mais cela devrait ĂȘtre soigneusement rĂ©flĂ©chi.

Oh, attendez. Je pense que je comprends pourquoi vous préférez par matériau. De cette façon, un seul vUv est calculé dans le vertex shader, au lieu de calculer l'uv par pixel dans le fragment shader. Droit?

Non. L'uv est calculé dans le vertex shader comme toujours.

Imaginez une feuille de sprites et 20 sprites. Actuellement, nous avons besoin de 20 matériaux clonés et de 20 textures clonées -- tout comme dans http://threejs.org/examples/misc_ubiquity_test2.html. (BTW, notez que nous avons déjà SpriteMaterial.rotation .)

En déplaçant le décalage vers le matériau, nous aurions besoin de 20 matériaux clonés et d'une texture.

En fait, en déplaçant l'offset vers le sprite, nous aurions besoin d'un matériau et d'une texture.

Imaginez une feuille de sprites et 20 sprites. Actuellement, nous avons besoin de 20 matériaux clonés et de 20 textures clonées

Ohm, je n'envisageais pas ce cas d'utilisation. Merci!

Je vais réfléchir à ça...

Je ne préconise pas de transformations UV dans la texture.

Pour deux raisons : (1) c'est déroutant, (2) il y a plus d'événements à propager, et (2) c'est du gaspillage.

Confusion : la raison en est que nous n'avons qu'une seule variable UV pour les cartes principales, mais s'il y a une transformation UV sur l'une des textures, il est dĂ©routant que cette transformation UV puisse ĂȘtre appliquĂ©e Ă  toutes les cartes qui utilisent le premier UV canal, que les autres textures aient ou non une transformation. Si nous permettions Ă  chaque map d'avoir sa propre transformation UV dans le matĂ©riau, je serais plus d'accord avec la transformation UV associĂ©e Ă  la texture - mais c'est difficile Ă  faire en raison de son utilisation uniforme des fragments.

Plus de propagation d'Ă©vĂ©nements : L'autre problĂšme que j'ai rencontrĂ© dans Clara.io est la propagation d'Ă©vĂ©nements lors de la tentative d'animation de paramĂštres de texture. On a besoin de chaque texture pour garder une trace de chaque matĂ©riau qui l'utilise, puis dire Ă  ces matĂ©riaux qu'ils sont sales et doivent ĂȘtre recalculĂ©s. Il n'est pas impossible de le faire, juste plus de travail.

Gaspillage : L'autre problĂšme est que si vous avez plusieurs instances d'un modĂšle 3D ou d'un dĂ©pit et qu'elles ont toutes la mĂȘme texture animĂ©e. Dans ce cas, vous devrez avoir des copies distinctes de la texture en mĂ©moire juste pour les animer diffĂ©remment, mĂȘme si les donnĂ©es de texture elles-mĂȘmes sont les mĂȘmes. C'est un peu un gaspillage dans ce sens par rapport Ă  la mise des donnĂ©es de transformation UV sur les matĂ©riaux.

Ainsi, si nous n'avons qu'une seule transformation UV autorisĂ©e par matĂ©riau, je la mettrais sur le matĂ©riau lui-mĂȘme. Je suivrais le modĂšle Unity 5 oĂč ils ont un dĂ©calage UV, une rotation dans le matĂ©riau. Les dĂ©veloppeurs de jeux connaissent dĂ©jĂ  cette approche.

Je pense que les sprites sont également bien gérés par UV Transform sur les matériaux - c'est trÚs similaire au cas du modÚle 3D ci-dessus.

Having only one uvTransform per material seems very very limiting.

Tout Ă  fait d'accord ici. Ne pas avoir cette fonctionnalitĂ© est extrĂȘmement limitatif. Il y a des effets fantastiques qui pourraient ĂȘtre fournis ici qui ne le sont tout simplement pas parce que chaque dĂ©calage est verrouillĂ© ensemble.

Mais comment rendre cette fonctionnalité disponible sans s'étouffer avec des clones ?

Je pense que le fait d'avoir les valeurs sur le matĂ©riau plutĂŽt que sur la texture est logique pour le cas d'utilisation courant oĂč toutes vos textures seraient mises en correspondance.

Tout Ă  fait d'accord ici. Ne pas avoir cette fonctionnalitĂ© est extrĂȘmement limitatif. Il y a des effets fantastiques qui pourraient ĂȘtre fournis ici qui ne le sont tout simplement pas parce que chaque dĂ©calage est verrouillĂ© ensemble.

Mais comment rendre cette fonctionnalité disponible sans s'étouffer avec des clones ?

THREE.ShaderMaterial ou THREE.RawShaderMaterial vous donneraient cette capacité, et étant donné qu'elle ne fonctionne pas actuellement avec des matériaux ordinaires, c'est l'itinéraire que vous devriez utiliser de toute façon.

Si vous faites quelque chose de plus funky, ce sera probablement plus funky que de simplement ajuster les répétitions et les décalages des cartes indépendamment, donc vous vous pencheriez probablement de cette façon de toute façon.

+1 pour ça, les gars.

Ce serait trÚs utile lorsque vous avez une feuille de sprite géante (aka atlas) et que vous souhaitez réutiliser sa texture sur plusieurs instances THREE.Sprite .

des nouvelles Ă  ce sujet? Ce problĂšme est toujours une faille assez flagrante dans l'API. La plupart des types de cartes ont des dĂ©calages/rĂ©pĂ©titions qui ne sont pas utilisĂ©s, et la propagation d'Ă©vĂ©nements rend quelque chose comme un sprite animĂ© sur un plan plus lent/mĂ©moire qu'il ne devrait l'ĂȘtre.

La flexibilitĂ© pour les cartes animĂ©es N'EXISTE PAS dans le systĂšme actuel. L'argument revient sans cesse selon lequel nous rĂ©duirions la flexibilitĂ© en liant les paramĂštres au matĂ©riau. Cet argument est sans objet car cette flexibilitĂ© n'existe pas dans le systĂšme actuel. Vous ne pouvez dĂ©finir le dĂ©calage/rĂ©pĂ©tition que globalement pour le matĂ©riau, et il provient de la map diffuse (?). Cela conduit Ă  un problĂšme encore pire oĂč il y a des paramĂštres "dĂ©calage" / "rĂ©pĂ©tition" redondants sur la plupart des cartes utilisĂ©es, et chaque fois que vous souhaitez partager des textures pour l'animation, vous ne pouvez pas, vous devez faire un clone, donc la flexibilitĂ© est considĂ©rablement rĂ©duit. Vous vous attendez Ă  ce que chaque texture / map ait des dĂ©calages uniques, mais ce n'est pas possible dans l'Ă©tat actuel des choses, et dans la plupart des cas, vous voulez en fait un ensemble de dĂ©calages UV car il serait ennuyeux de dĂ©finir les dĂ©calages sur la mĂȘme chose pour normal/spec /diffuse (une normal map dĂ©filant sur une map diffuse fixe est une utilisation de niche oĂč un matĂ©riau de shader pourrait ĂȘtre utilisĂ©).

Si vous regardez les shaders rĂ©els en cours de construction, le dĂ©calage / rĂ©pĂ©tition de la texture EST liĂ© au matĂ©riau, mais Ă©trangement copiĂ© Ă  partir d'une carte qui ne devrait en aucun cas ĂȘtre sous contrĂŽle. Le matĂ©riau DOIT ĂȘtre sous contrĂŽle pour que cela soit rapide et Ă©lĂ©gant sans redondance.

Le meilleur des deux mondes est possible avec des tonnes de drapeaux supplémentaires, mais je ne pense pas que ce soit une meilleure solution que de simplement demander aux utilisateurs d'essayer d'utiliser le matériau du shader à la place pour ce genre de cas de bord spécifiques.

La solution Ă  cela est le NodeMaterial de @sunag btw.

J'ajoute aussi mon +1 pour ça ! Cela rendrait le travail avec des feuilles de sprite beaucoup plus agréable.

:+1: J'ai trouvé cela surprenant. J'ai dû commencer à dupliquer mes textures pour chaque sprite du jeu, car tous mes sprites répétés s'animaient les uns les autres. On dirait que cela signifie que je charge des données de sprite redondantes sur le GPU ?

Est-ce que quelqu'un a une solution à ce problÚme ? Serait-il possible de manipuler l'offset UV en définissant directement l'uniforme sur le shader, en contournant l'interface Texture ?

La solution Ă  cela est le NodeMaterial de @sunag btw.

@bhouston , pourriez-vous s'il vous plaßt fournir un lien? Il n'y a pas de référentiel public sous le compte de @sunag avec ce nom.

@rhys-vdw Il se trouve ici dans la branche dev uniquement :

https://github.com/mrdoob/three.js/tree/dev/examples/js/nodes

C'est nouveau, donc je ne sais pas s'il est prĂȘt Ă  ĂȘtre utilisĂ© sur les sprites, mais c'est un systĂšme de shader entiĂšrement basĂ© sur des graphes, il vous donnera donc la possibilitĂ© de modifier arbitrairement les accĂšs aux textures.

C'est nouveau, donc je ne sais pas s'il est prĂȘt Ă  ĂȘtre utilisĂ© sur les sprites, mais c'est un systĂšme de shader entiĂšrement basĂ© sur des graphes, il vous donnera donc la possibilitĂ© de modifier arbitrairement les accĂšs aux textures.

@bhouston Je peux créer un exemple avec Node, ça a l'air bien.

À propos du THREE.SpriteMaterial vous pouvez accĂ©der Ă  l'offset/Ă  l'Ă©chelle pour crĂ©er le spritesheet avec ceci par exemple :

var offsetX = frameX / mapWidth;
var scaleX = mapWidth / frameWidth;

sprite.material.map.offset.x = offsetX;
sprite.material.map.repeat.x = scaleX;

https://github.com/mrdoob/three.js/blob/master/src/renderers/webgl/plugins/SpritePlugin.js#L53

Le systĂšme basĂ© sur les nƓuds n'est pas un correctif... Il ne rĂ©sout toujours pas les problĂšmes avec l'API. Il faut 2 secondes pour ajouter un dĂ©calage/rĂ©pĂ©tition au prototype de matĂ©riau et faire en sorte que le moteur de rendu lise cela au lieu de la texture. Je l'ai dĂ©jĂ  fait pour mon projet, mais le fait reste qu'il s'agit d'un dĂ©faut Ă©vident dans l'API qui devrait ĂȘtre officiellement modifiĂ© pour Ă©viter les maux de tĂȘte aux nouveaux utilisateurs qui rencontreront ce problĂšme s'ils essaient de faire quelque chose de commun.

...donc cela vous donnera la possibilité de modifier arbitrairement les accÚs aux textures.

tbh je ne sais pas ce que cela signifie. Pour animer des uniformes de shader d'ensemble individuels pour le "décalage" et la "répétition" par matériau.

À propos du THREE.SpriteMaterial, vous pouvez accĂ©der Ă  l'offset/Ă  l'Ă©chelle pour crĂ©er la feuille de sprite avec ceci par exemple...

@sunag , le problĂšme n'est peut-ĂȘtre pas clair. Le code que vous avez partagĂ© modifie la texture, qui est partagĂ©e par toutes les instances de ce matĂ©riau. Cela signifie qu'il est impossible d'avoir deux matĂ©riaux partageant une texture, mais avec des dĂ©calages uniques - par exemple, deux sprites ennemis montrant des images d'animation diffĂ©rentes.

Je l'ai dĂ©jĂ  fait pour mon projet, mais le fait reste qu'il s'agit d'un dĂ©faut Ă©vident dans l'API qui devrait ĂȘtre officiellement modifiĂ© pour Ă©viter les maux de tĂȘte aux nouveaux utilisateurs qui rencontreront ce problĂšme s'ils essaient de faire quelque chose de commun.

@QuaziKb Y a-t-il un PR que je peux cibler pour mon projet ?

Bien que tout cela ne soit pas un problĂšme si, comme l' a dit

Si nous gardons l'approche actuelle, une chose qui doit ĂȘtre modifiĂ©e, c'est que lorsqu'une texture est clonĂ©e, l'image partagĂ©e ne doit ĂȘtre transmise au GPU qu'une seule fois.

Est-ce exact?

@sunag , le problĂšme n'est peut-ĂȘtre pas clair. Le code que vous avez partagĂ© modifie la texture, qui est partagĂ©e par toutes les instances de ce matĂ©riau. Cela signifie qu'il est impossible d'avoir deux matĂ©riaux partageant une texture, mais avec des dĂ©calages uniques - par exemple, deux sprites ennemis montrant des images d'animation diffĂ©rentes.

Hmm, pour ce que NodeMaterial rĂ©soudrait certainement, vous pourrez partager la mĂȘme texture avec diffĂ©rents matĂ©riaux et un dĂ©calage UV indĂ©pendant et des avantages tels que des filtres personnalisĂ©s et d'autres choses qu'un matĂ©riau basĂ© sur des nƓuds peut offrir.

https://github.com/mrdoob/three.js/issues/7522

Mais pour le moment, quelqu'un a essayé d'instancier l'uuid comme ceci : ?

THREE.Texture.prototype.createInstance = function() {

    var inst = this.clone();

    inst.uuid = this.uuid;
    inst.version = this.version;

    return inst;

}

si vous utilisez needsUpdate mettez Ă©galement version .

Exemple:

var uniqueTextureOffset = map.createInstance();
var material = new THREE.SpriteMaterial( { map: uniqueTextureOffset } );

Maintenez le mĂȘme uuid et version partagera le texture sur GPU.

https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js#L2832
https://github.com/mrdoob/three.js/blob/master/src/renderers/webgl/WebGLProperties.js#L11

MĂȘme si pour moi c'est une solution provisoire. Je crois en NodeMaterial pour l'avenir.

Pouvons-nous s'il vous plaßt déplacer les transformations UV vers le matériau ?

Que diriez-vous du meilleur des deux mondes. Ajoutez un drapeau overrideOffsetRepeat sur le matériel avec un nouveau uvOffset et uvRepeat sur le matériel. De cette façon, si le drapeau est faux, il est rétrocompatible, et c'est la valeur par défaut. Et si c'est vrai, il utilise le décalage/répétition de matiÚre. Je soutiendrais cela car il semble que le besoin soit intense et généralisé. @WestLangley ? @mrdoob ?

(Bien que je supporte vraiment l'utilisation de NodeMaterial pour tout ce qui va de l'avant, mais c'est pénible de passer à celui-ci.)

Je pense toujours que la solution pour cela est de créer THREE.Image . https://github.com/mrdoob/three.js/issues/5876#issuecomment -81189892

THREE.Image

@mrdoob , cela signifierait-il que chaque Texture attribué serait cloné avec un Material ?

@mrdoob a Ă©crit :

Je pense toujours que la solution pour cela est de créer THREE.Image

Oui, cela fonctionnerait, mais ce serait un peu moins rĂ©trocompatible (si nous exigeons maintenant que tout le monde crĂ©e des images avant de crĂ©er une texture), mais une conception globale plus propre. Peut-ĂȘtre qu'il est possible d'avoir une image crĂ©Ă©e automatiquement par texture si on ne la spĂ©cifie pas sĂ©parĂ©ment, cela permettrait d'obtenir une rĂ©trocompatibilité ? Et vous n'auriez besoin de manipuler l'image directement que si vous vouliez faire quelque chose de dĂ©licat.

Je suppose que cette solution nĂ©cessiterait deux fois les nouveaux objets pour un ensemble de sprites - une texture pour chaque sprite et un matĂ©riau ? OĂč est l'autre approche qui nĂ©cessiterait juste un nouveau matĂ©riau pour chaque sprite ?

Je sais que Unity prend en charge la rĂ©pĂ©tition/dĂ©calage par matĂ©riau, mais les outils VFX haut de gamme comme 3DS Max, Maya, Softimage ne le font pas - ils ont juste un nƓud Bitmap et un nƓud Texture (qui contient Ă  la fois le nƓud Bitmap ainsi qu'un mappage UV nod), qui est similaire au design de

UE4 est Ă©galement similaire Ă  ce que propose

Les outils avancĂ©s sĂ©parent l'image/le bitmap de la texture et ils sĂ©parent Ă©galement un nƓud de mappage UV sĂ©parĂ©, sous cette forme :

 -> Bitmap
 -> UVMapping

Nous n'autorisons pas beaucoup d'options UVMapping dans le StandardMaterial principal pour le moment. Mais divers types d'UVMappings utilisés dans UE4, Maya, Softimage, 3DS Max, seraient le canal à utiliser, une transformation à lui appliquer, pour utiliser les coordonnées mondiales comme source, ou si l'on devait faire une projection sphérique, cube, planaire sur la base des paramÚtres requis pour ces projections.

UE4 a une texture de sprite qui permet la répétition/le décalage dans le matériau :

https://docs.unrealengine.com/latest/INT/Engine/Paper2D/Sprites/index.html

Maya, Softimage, 3DS Max et UE4 ont la sĂ©paration de Bitmap/Image de Texture (et de la gĂ©nĂ©ration UV) comme le suggĂšre @mrdoob , mais ils utilisent Ă©galement tous des graphiques de shader pour y parvenir. Unity3D, qui n'a pas de graphiques de shader, est l'outil qui intĂšgre le dĂ©calage/rĂ©pĂ©tition dans le matĂ©riau lui-mĂȘme, probablement parce qu'il ne peut pas correctement le sĂ©parer en un nƓud de graphique de shader.

Peut-ĂȘtre qu'il est possible d'avoir une image crĂ©Ă©e automatiquement par texture si on ne la spĂ©cifie pas sĂ©parĂ©ment, cela permettrait d'obtenir une rĂ©trocompatibilité ? Et vous n'auriez besoin de manipuler l'image directement que si vous vouliez faire quelque chose de dĂ©licat.

Exactement 😊

Probablement un peu déplacé à mentionner, mais je voudrais recommander que PTEX soit incorporé dÚs que possible.
http://ptex.us/PtexFile.html
S'il existe un moyen de faire des projections typiques, etc., convertissez/convertissez en NodeTexture (?) Ou une option qui est un nouveau systĂšme de mappage de texture de base plus puissant et plus complet ? ... eh bien, c'est peut-ĂȘtre quelque chose Ă  considĂ©rer Ă  l'avance.
[Suite au mĂȘme point :]
Le concept avec ptex n'est pas vraiment une image 2D mais une relation uv afin que vous puissiez peindre/tamponner/projeter autour d'une surface complexe sans le concept/défi de la façon de traduire 2D en 3D, ce qui est mathématiquement un hack au mieux en comparaison ( toujours techniquement aux prises avec la destruction).
Je souligne simplement que ptex aurait dĂ» avoir plus de sens et ĂȘtre une prioritĂ© il y a plus de 20 ans et ne devrait pas ĂȘtre considĂ©rĂ© comme une extension ou un interprĂšte de deuxiĂšme classe, mais vraiment pour moi c'est l'inverse. Cela devrait ĂȘtre l'ancienne façon originale de dire de maniĂšre dĂ©clarative comment une image 2D est projetĂ©e/estampĂ©e dans le seul vrai systĂšme de niveau de base toujours fonctionnel de ptex. Quoi qu'il en soit, il suffit de faire respecter l'idĂ©e qu'il devrait ĂȘtre intĂ©grĂ© sinon mieux prendre un rĂŽle plus central.
Merci pour l'opportunitĂ© de faire de nobles suggestions. J'Ă©tais tellement heureux que le ptex ait Ă©tĂ© fabriquĂ© selon les spĂ©cifications. J'y ai pensĂ© moi-mĂȘme plus de 10 ans auparavant, mais en tant qu'enfant, je n'avais pas le pouvoir de dĂ©finir de nouvelles spĂ©cifications, etc. Avec le recul, j'aurais dĂ» voir que j'aurais peut-ĂȘtre pu essayer de faire la diffĂ©rence au lieu du rĂŽle d'observateur que je maintiens toujours. Voici donc une tentative pour rĂ©parer une erreur de longue date.

Peut-ĂȘtre que quelqu'un peut dĂ©marrer un nouveau fil de discussion si quelqu'un ayant une comprĂ©hension plus approfondie des mĂ©thodes actuelles potentiellement dans Flux peut faire une proposition plus applicable sur la façon dont cela fonctionnerait dans THREEjs.
Encore merci pour l'opportunitĂ© d'ĂȘtre entendu.

@MasterJames sorte de hors-sujet... créez un nouveau fil s'il vous plaßt ?

MĂȘme si nous avions une image pour que la "texture" puisse toujours ĂȘtre utilisĂ©e, tous les matĂ©riaux devraient ĂȘtre rĂ©Ă©crits, car ils ne prennent pas en charge plus d'un dĂ©calage/rĂ©pĂ©tition UV. Évidemment, cela pourrait changer, mais finirait probablement par ajouter de la complexitĂ© car des uniformes redondants seraient alors nĂ©cessaires (Ă  quelle frĂ©quence voulez-vous plus d'un ensemble de dĂ©calages/rĂ©pĂ©titions pour que, par exemple, une carte normale soit dĂ©calĂ©e d'un diffus) je pense qu'Ă  la fin pour le web oĂč les performances sont primordiales, le cas d'utilisation le plus courant est celui oĂč il existe un dĂ©calage/rĂ©pĂ©tition global qui affecte chaque carte, et il est logique que cela soit sur le matĂ©riau puisqu'il finit par faire partie de l'architecture des matĂ©riaux. Les matĂ©riaux de shader personnalisĂ©s peuvent trĂšs bien gĂ©rer les cas de bord.

@QuaziKb Oui. C'est ce que NodeMaterial s'attaque.

N'est-il pas vrai que Texture utilise la mĂȘme instance de texture OpenGL pour chaque .clone() , ou est-ce que j'ai ratĂ© quelque chose. Le recharge-t-il rĂ©ellement pour chaque clone ? Si c'est le cas, alors c'est un problĂšme _trĂšs_ sĂ©rieux.

@evrimoztamur , je crois qu'il copie la texture à chaque fois. Vous pouvez vérifier ce qui se passe en utilisant WebGL Inspector .

J'ai essayĂ© toutes les approches auxquelles je pouvais penser, y solution de contournement de @sunag , mais rien n'a fonctionnĂ©. Sur la base de mes expĂ©rimentations n'ayant pas donnĂ© de rĂ©sultats et de la discussion ci-dessus, j'ai examinĂ© comment d'autres bibliothĂšques gĂšrent l'animation de sprite. J'ai trouvĂ© que les API Sprite et SpriteManager de Babylon.js Ă©taient une solution qui rĂ©pondait Ă  mes besoins particuliers. Il gĂšre les feuilles de sprite, le dĂ©calage et la rĂ©pĂ©tition, et les animations. Il s'agit peut-ĂȘtre d'un niveau d'abstraction plus Ă©levĂ© que celui que THREE.js vise Ă  fournir, mais cela pourrait valoir le dĂ©tour comme rĂ©fĂ©rence.

@rhys-vdw : Pour un projet en cours, je me suis retrouvé avec une version bùtarde de MeshBasicMaterial :
https://gist.github.com/karimbeyrouti/790d2e1a8c0137b16bae

Lorsque vous définissez la carte, cela attribue automatiquement les uniformes de décalage/répétition (qui sont dans un matériau caché). Vous pouvez facilement les définir séparément - cela vous évitera d'avoir besoin de cloner des textures pour le moment. (fonctionne avec r73)

Je viens de soumettre un PR qui devrait résoudre ce problÚme, PR # 8278

@WestLangley a Ă©crit :

Je pense qu'il est raisonnable de supposer que les cartes suivantes ont les mĂȘmes valeurs de dĂ©calage/rĂ©pĂ©tition :

carte
carte spéculaire
normalCarte
bumpMap
alphaMap
aoMap (futur)
glossMap (futur)
déplacementMap (futur)

Pas toujours. J'utilise actuellement diffĂ©rentes valeurs de rĂ©pĂ©tition pour une carte et une bumpmap sur le mĂȘme matĂ©riau (asphalte) pour masquer le fait que les deux sont carrelĂ©s avec des carreaux plutĂŽt petits. De cette façon, je n'ai pas besoin de gĂ©nĂ©rer/avoir une grosse texture. C'est trĂšs pratique. :-)

EDIT : C'est du moins ce que je pensais avoir fait. L'astuce a probablement été ignorée. Et je peux obtenir des résultats similaires en ajoutant du bruit dans le shader ou quelque chose du genre. La démo Matrix3 de WestLangley est cool.

Je pense que cela rĂ©sout le problĂšme des instances avec diffĂ©rents UV dans Sprite. Il est possible de modifier les vertex et pixel shader conservant la mĂȘme texture.

https://threejs.org/examples/#webgl_sprites_nodes

Il utilise SpriteNodeMaterial et Mesh avec un PlaneBufferGeometry partagĂ©. L'interface n'est pas adaptĂ©e Ă  Sprite mais fonctionne. Peut-ĂȘtre qu'il peut Ă©voluer vers SpriteMesh pour rendre une interface plus conviviale

ce fil est TL; DR pour moi. mais je viens de découvrir ce code en r68 (ancien projet, oui):

        // uv repeat and offset setting priorities
        //  1. color map
        //  2. specular map
        //  3. normal map
        //  4. bump map
        //  5. alpha map

        var uvScaleMap;

        if ( material.map ) {

            uvScaleMap = material.map;

        } else if ( material.specularMap ) {

            uvScaleMap = material.specularMap;

        } else if ( material.normalMap ) {

            uvScaleMap = material.normalMap;

        } else if ( material.bumpMap ) {

            uvScaleMap = material.bumpMap;

        } else if ( material.alphaMap ) {

            uvScaleMap = material.alphaMap;

        }

        if ( uvScaleMap !== undefined ) {

            var offset = uvScaleMap.offset;
            var repeat = uvScaleMap.repeat;

            uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );

        }

Donc voilĂ ...

si vous allez proposer un changement fondamental à la bibliothÚque, comme celui que vous avez proposé ici, vous devez fournir un argument clair et convaincant pour ce changement

J'essayais de définir une répétition différente sur les cartes diffuses et normales et je m'arrachais les cheveux parce que cela ne fonctionnait pas. puisque l'API place ce paramÚtre dans la texture, je pensais pouvoir le faire. alors oui, que diriez-vous de garder mes cheveux pour un argument convaincant ? ce ticket est toujours ouvert, 3js a toujours ce paramÚtre sur les textures, et il n'est respecté que pour l'une des textures = c'est, en effet, déjà le paramÚtre EST par matiÚre.

Si vous n'allez pas déplacer cela à sa place, dites au moins que cela n'a aucun effet dans les documents ?

@sunag pour les relations publiques :
https://github.com/mrdoob/three.js/pull/11531

Un problÚme que j'ai rencontré :
https://jsfiddle.net/f0j2v3s8/

Il semble que la transparence de SpriteNodeMaterial soit perdue, il n'y a aucune combinaison de mélange que je puisse utiliser pour que cet exemple fonctionne.

Des idées?

@karimbeyruti a Ă©crit :

Lorsque vous définissez la carte, cela attribue automatiquement les uniformes de décalage/répétition (qui sont dans un matériau caché). Vous pouvez facilement les définir séparément - cela vous évitera d'avoir besoin de cloner des textures pour le moment. (fonctionne avec r73)

Je pense que c'est obsolÚte puisque uniforms.offsetRepeat est changé en uniforms.uvTransform (r88).

En ce qui concerne le cas d'utilisation « réutiliser un atlas de textures avec plusieurs instances d'Object3D », je suggÚre une simple promenade :

  1. stocker les données UVs (décalage, répétition) dans un objet json atlas ;
  2. accrocher la paire de fonctions onBeforeRender\onAfterRender d'Object3D ;
  3. dans le rappel avant le rendu, chargez les données UV de l'objet json atlas et définissez-les sur material.map;
  4. dans le rappel aprÚs rendu, réinitialisez-le ;

Il en résultera :

  1. une seule texture et un seul matériau partagé par plusieurs objets, aucun clone n'est nécessaire et le compteur info.memory.textures n'augmentera pas ;
  2. mais toujours toutes les autres maps (normales, ao, dĂ©placement...) doivent respecter la mĂȘme translation UV ;
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

donmccurdy picture donmccurdy  Â·  3Commentaires

seep picture seep  Â·  3Commentaires

jack-jun picture jack-jun  Â·  3Commentaires

yqrashawn picture yqrashawn  Â·  3Commentaires

fuzihaofzh picture fuzihaofzh  Â·  3Commentaires