Three.js: 䞡面マテリアルを持぀メッシュの䞀郚で法線が反転したした

䜜成日 2019幎10月23日  Â·  36コメント  Â·  ゜ヌス: mrdoob/three.js

問題の説明

107から108にアップグレヌドするず、モデルの䞀郚が法線を反転したように芋えるこずに気付きたした。 これは䞡面玠材でのみ発生したす。
ここを参照しおください https 

これは、パタヌンが䞡方のホむヌルでむンデントされおいる状態で、どのように芋えるかを瀺しおいたす。 それが107幎のこずでした
Screen Shot 2019-10-23 at 3 51 35 PM

108では、ホむヌルの1぀に、飛び出しおいるように芋えるパタヌンがありたす。
Screen Shot 2019-10-23 at 3 51 27 PM

Three.jsバヌゞョン
  • [x] r108
ブラりザ
  • [x]それらすべお
OS
  • [x]それらすべお
  • [ ] りィンドりズ
  • [ ] マックOS
  • [] Linux
  • [] Android
  • [] iOS
Bug Regression

最も参考になるコメント

それを修正したす
Screen Shot 2019-11-21 at 10 02 54 AM

党おのコメント36件

@pushmatrixこのモデルが独自の接線を提䟛するかどうかを確認できたすか これが11438に関連しおいるのではないかず思いたす。

私はそれがそれ自身の接線を指定するずは思わない

別のテストケヌスを䜿甚しお、git bisectは、メッシュが䞡面で負のスケヌルXを持っおいる堎合に問題を開始したPRずしお17586を指したす。ただし、これはr.108ではなくr.109にありたした。

このPRのモデルは利甚できないため、これはテストされおいたせん。

これがテストGLBです
Wheels.glb.zip

3幎前から https 

基本的には... gl_FrontFaceがAdrenoGPUの䞡面マテリアルで正しく機胜しおいないようです。

これは私たちが察応する必芁がある問題ですか

//

normalmap_pars_fragment Adrenoの回避策を削陀するず、このモデルは私のマシンで正しくレンダリングされるように芋えたす。

#ifdef DOUBLE_SIDED

    // Workaround for Adreno GPUs gl_FrontFacing bug. See #15850 and #10331

    bool frontFacing = dot( cross( S, T ), N ) > 0.0;

    mapN.xy *= ( float( frontFacing ) * 2.0 - 1.0 );

#else

    mapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );

#endif

うヌん、そのコメントも読んだこずを芚えおいたす。 私はこのバグを芋おいるずきに遭遇したず思いたす。これは明らかにr108で修正されたした少なくずもアップグレヌドするず修正されたした https 

倚分それは関連しおいたすか FWIW、私は叀いAdreno GPUに぀いおいく぀かのフィヌドバックを埗たので、明らかにそれらはただかなり䞀般的です。

確認のために、これはただdevたす

Screen Shot 2019-10-25 at 4 06 51 PM

確認のために、これはただdevで発生したす

正しい。 ただし、Adrenoのバグ回避策を削陀した堎合はそうではありたせん。

ただし、Adrenoのバグ回避策を削陀した堎合はそうではありたせん。

今のずころ回避策を削陀しおから、別の解決策を探すのはどうですか 珟圚の実装では、䜿甚しおいるプラ​​ットフォヌムに関係なく、誀ったビゞュアルが発生したす。

@ Mugen87この特定のケヌスでは、ゞオメトリは互いにミラヌであるず思いたすが、それらは同じ法線マップを共有しおいたす。

仰るずおりです。 私は、すべおのナヌスケヌスで正しいAdreno互換の回避策を芋぀けるために䜕時間も費やしおきたした。

ホむヌルモデルモデルを調べるず、各ホむヌルには独自のUVシェルがありたす。 共有しおいたせん。
そしお、頂点の順序は逆です。

ただし、少なくずもBlenderでは、顔の向きは同じです。

Screen Shot 2019-11-18 at 11 21 05 AM

そのため、それがr108のバグなのか、それずもr108が正垞に動䜜しおいるかどうかはわかりたせん。 ¯_ツ_ /¯

@pushmatrixはUnityやBlenderず比范できたすか

@mrdoob

Blender 2.8

Screen Shot 2019-11-20 at 8 27 27 AM

Unity

Screen Shot 2019-11-20 at 8 40 30 AM

Sketchfab

Screen Shot 2019-11-20 at 8 32 48 AM

@pushmatrix

光がカメラず同じ方向にあるため、Unityは芋づらいですが、Unityも間違っおいるように芋えたすか 🀔

@mrdoob

ええ、それは照明に少し䟝存したすが、それは幻想であり、いく぀かの堎所でポップアップしたように芋えたす。 しかし、回転するず消えたす。

ここでそれは別の芳点から芋お、正しいように芋えたす
Screen Shot 2019-11-20 at 2 36 16 PM

@mrdoob前面は、three.jsで反時蚈回りに巻かれおいたす。 通垞、各面の3぀の頂点のUVも、UVマップ䞊で反時蚈回りに巻かれおいたす。

この䟋では、私の_予想_は巊偎のモデルに反時蚈回りのUVがあり、右偎のモデルには_時蚈回りの_UVがありたす。 doubleSideがtrue堎合、右のモデルはthree.jsで正しくレンダリングされたせん。

AFAIK、Adrenoの回避策を削陀するず、Adreno以倖のGPUの問題が修正されたす。

@pushmatrix Unityの䟋には、2぀の方向からの指向性ラむトがあるように芋えたす。 そのため、䜕が起こっおいるのかを識別するのが難しくなりたす。 単䞀のラむトが奜たしい堎合がありたす。

@WestLangleyモデルビュヌアが䜿甚しおいるのず同じ環境マップを䜿甚しおいたすが、同じ回転がない可胜性がありたす。 シングルラむトで詊しおみたす。

@WestLangley䞀方向ラむトが回転したす。 目の錯芚を芋おいるような気がしたす

unity

Unityは、光がどのように圓たるかに応じお溝を出し入れするように芋えたすが、少なくずも䞡方で䞀貫しおいたす。

Threejsも䞀貫しおいたすが、間違いなく垞に飛び出しおいるように芋えたす。
wheels

Unityのものに䜕か問題があるように感じたす...
のようなものが必芁です。 material.normalMapScale.x = -1 。

@WestLangley

@mrdoob前面は、three.jsで反時蚈回りに巻かれおいたす。 通垞、各面の3぀の頂点のUVも、UVマップ䞊で反時蚈回りに巻かれおいたす。

この䟋では、私の_予想_は巊偎のモデルに反時蚈回りのUVがあり、右偎のモデルには_時蚈回りの_UVがありたす。 doubleSideがtrue堎合、右のモデルはthree.jsで正しくレンダリングされたせん。

AFAIK、Adrenoの回避策を削陀するず、Adreno以倖のGPUの問題が修正されたす。

ありがずう、それは理にかなっおいたす。 しかし、それでもさらに調査する䟡倀があるず思いたす。 Sketchfabがすべおのデバむスで正しく芋える堎合は、シェヌダヌを確認する必芁がありたす。

今日、それぞれのシェヌダヌコヌドを確認したしたが、「ピクセルごずの接空間法線マッピング」を䜿甚しおいないようです。

この投皿によるず、Sketchfabはアセットの接線定矩を期埅しおいるか、これらのデヌタは
UV座暙に基づいお生成したす。 これは、GLSLコヌドで芋たものに察応しおいたす。

BufferGeometryUtils.computeTangents()を介しおモデルに接線を远加し、 Material.vertexTangentsをtrueず、結果は正垞に芋えたす。

image

ずころでこの投皿でSketchfabのコヌドスニペットを共有しおも倧䞈倫ですか^^ 結局のずころ、それはオヌプン゜ヌスではありたせん。

䞀貫性を保぀ために、1぀の指向性ラむトが前埌に移動するSketchfabを次に瀺したす。

sketchfab

芚えおおくべきこずの1぀は、Sketchfabはモデルをアップロヌドするずきに凊理を実行するため、生成したり倉曎したりする可胜性が非垞に高いこずです。 衚瀺しおいるのはglTFではなく、独自の圢匏に倉換されたglTFファむルです。

@ pushmatrix 17958がモデルで機胜するこずを_

three.jsは、フラグメントシェヌダヌでタンゞェントを蚈算したす。 特定のバグのあるAdrenoGPUに察応するためのハックが削陀されれば、正しく機胜するず思いたす。 17958を参照しおください。

//

Sketchfabは、接線が必芁でモデルによっお提䟛されおいない堎合に、CPUで接線を蚈算したす。  @donmccurdyこれはglTF仕様に必芁なものです。

three.jsもそれを行うこずができたすが、それはすべおの組み蟌みゞオメトリに正しい接線を远加するこずを意味したす。 three.jsは、 ComputeTangents()を眮き換えるためにMIKKTSpaceアルゎリズムも実装する必芁がありたす。 three.jsはむンデックス付きずむンデックスなしの䞡方のゞオメトリをサポヌトしおいるため、これにはかなりの劎力が必芁になるず思いたす。

それを修正したす
Screen Shot 2019-11-21 at 10 02 54 AM

さお、ここでの解決策は、Adrenoの回避策17958を元に戻し、モデルに接線がなく、Adreno GPUのサポヌトを目指しおいる堎合15850にBufferGeometryUtils.computeTangents()を䜿甚するこずを掚奚するこずです。 。

いいですね

別の解決策は、提䟛されおいないずきに゚ンゞンでBufferGeometryUtils.computeTangents()を自動的に呌び出し、フラグメントシェヌダヌでタンゞェントを蚈算するすべおのコヌドを削陀するこずです...🀔

BufferGeometryUtils.computeTangents()珟圚むンデックスを必芁ずしおいるため、コアで䜿甚するこずはできたせん。 ただし、 three.jsがある時点でMIKKTSpaceに埓っお接線を生成し、 perturbNormal2Arb()削陀できるずよいず思いたす。

@WestLangleyは曞いた

これは、すべおの組み蟌みゞオメトリに正しい接線を远加するこずを意味したす。

考えを倉える...接線は必ずしも必芁ではありたせん。 代わりに、メ゜ッドBufferGeometry.computeTangents()を埩元し、解析的に正確な接線を蚭定できるすべおの組み蟌みゞオメトリに察しおそのメ゜ッドを「オヌバヌラむド」したす。

//

別の解決策は、提䟛されおいない堎合に゚ンゞンでBufferGeometryUtils.computeTangentsを自動的に呌び出し、フラグメントシェヌダヌでタンゞェントを蚈算するすべおのコヌドを削陀するこずです...

それは私には正しいように聞こえたす。

BufferGeometryUtils.computeTangentsは珟圚むンデックスを必芁ずしおいるため、コアで䜿甚するこずはできたせん。

簡単に盎せるず思いたす。 たた、 https //github.com/mrdoob/three.js/issues/17804#issuecomment-557135610をサポヌトするように修正する必芁があり

three.jsがある時点でMIKKTSpaceに埓っお接線を生成し、perturbNormal2Arbを削陀できれば望たしいでしょう。

MikkTSpaceがフラグメントシェヌダヌの蚈算を必ずしも眮き換える必芁があるかどうかはわかりたせん。 シェヌダヌにはパフォヌマンスコストがほずんどなく、ほずんどのモデルで正垞に機胜したす。 接線の事前蚈算には、毎回頂点ごずの初期費甚がかかり、これらの特定の堎合を陀いお利点はありたせん。 😕glTF仕様に蚘茉されおいるこずにもかかわらず、デフォルトでそれを行うこずを正圓化するのに苊劎しおいたす。

BufferGeometryUtils.computeTangentsがMikkTSpaceアプロヌチを実装できれば、それは玠晎らしいこずです。これは、事前に蚈算する必芁がある堎合に最適なアルゎリズムです。 ただし、既存のネむティブ実装を䜿甚できるglTF-PipelineやgltfpackなどのツヌルにMikkTSpaceを配眮し、事前にオフラむンで蚈算を行う方がおそらく簡単です。

@donmccurdy

しかし、たずえば... <model-viewer>ナヌスケヌスでは、ナヌザヌがAdreno GPUを䜿甚しおいるかどうかを知るための信頌できる方法はないず思いたすが、正しく調べたいず思いたすhttps// github。 com / GoogleWebComponents / model-viewer / issues / 740。

接線が提䟛されおいない堎合、 <model-viewer> およびx-gpuサポヌトが必芁な他のプロゞェクトはBufferGeometryUtils.computeTangents呌び出す必芁がありたすか、それずも3぀ですか

@pushmatrix

ハハ、私はこれらのホむヌルがどこから来たのか気づきたした😁

https://bumbleride.com/products/era?variant=20719969599599

Screen Shot 2019-11-22 at 3 52 19 PM

@ mrdoob🕵

それでは、今のずころ回避策を元に戻したしょう。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡