Three.js: 遞択照明

䜜成日 2014幎08月10日  Â·  101コメント  Â·  ゜ヌス: mrdoob/three.js

これがすでに蚈画されおいる機胜なのか、完成した機胜なのかわからないので、最初にタスクに぀いお説明したす。

郚屋ごずに遞択的な照明を行う必芁がありたす。 たずえば、私には2぀の郚屋がありたす。 1぀のラむトは、1぀の郚屋のオブゞェクトず内壁にのみ圱響を䞎える必芁がありたす。 2番目の郚屋はこの光の圱響を受けおはいけたせん。

珟圚、シヌンにラむトを远加するず、その距離にあるすべおのオブゞェクトに圱響したす。 そしお、2番目の郚屋の「壁を通っお」光が入るず奇劙な効果が埗られたす。

ですから、ある光源の圱響を受けるオブゞェクトず別の光源の圱響を受けるオブゞェクトを蚭定できるように、照明には䜕らかのグルヌプたたはチャネルが必芁だず思いたす。

ラむトにもオブゞェにもそういうものは芋圓たらないので、いい機胜かもしれないず思いたした。

そしお、ずころで、ただ実装されおいない堎合、three.jsの珟圚の状態を䜿甚しおそのようなタスクを解決するための掚奚されるアプロヌチは䜕ですか

Enhancement

最も参考になるコメント

このような䟋ぞのリンクはありたすか

ここで、私はあなたのためだけに1぀䜜成したした https 

党おのコメント101件

私が蚀っおいるこずは基本的に持っおいるchannelでフィヌルドをTHREE.LightずlightChannelフィヌルドTHREE.Meshたたはそのような䜕か。 埌者がnullの堎合、すべおの光源の圱響を受けたす。 埌者がnullでない堎合は、同じ倀の光チャネルのみに圱響したす。

たたは、メッシュ自䜓ではなく、メッシュゞオメトリの面を分離するために远加するこずもできたす。

圱を䜿いたいようですね。

たあ、私は圱でそのようなこずを達成するこずができたしたそしお私はすでに詊したしたが、それは異なる副䜜甚を䞎え、いく぀かのオブゞェクトを照らしおからそれらに圱を萜ずす必芁がないので、それはハックだず感じたす。 そもそも火を぀けおはいけたせん。

私が必芁ずしおいるのは、特定の光源がメッシュの1぀のセットに圱響を䞎えるのではなく、他のセットに圱響を䞎えるこずです。

通垞、私は次のような手法を䜿甚しおこれを行いたす。

glEnable(GL_LIGHT0);
//...
glEnable(GL_LIGHTn);

// Draw the walls to room 1
DrawWalls(room[0]);

// Draw the contents of room 1
DrawContents(room[0]);

glDisable(GL_LIGHT0);
//...
glDisable(GL_LIGHTn);

// Draw the walls to room 2
DrawWalls(room[1]);

// Draw the contents of room 2
DrawContents(room[1]);

したがっお、それは単なる圱ずは異なる機胜のように芋えたす。 それずも私は䜕かが足りないのですか

はい...これは確かに䟿利だず思いたす。 ただし、そのAPIがどのように衚瀺されるかはわかりたせん。

たぶん、最も単玔な解決策がここで最も効果的かもしれたせん

  1. channel たたはgroup をTHREE.Light远加したす
  2. affectedByLightChannel たたはaffectedByLightGroup をTHREE.Mesh远加したすたたはゞオメトリの面に远加するこずもできたす

どう思いたすか

「affectedByLightChannel」が長すぎお「lightChannel」のようなものでもかたいたせんが、䟿利だず思いたす。光源ず受信機のチャンネル番号だけです。

そのように

    light = new THREE.PointLight(0xFFF7D6, 1.0, 15)
    light.channel = 123
    testScene.add(light)

    testScene = new THREE.Scene
    geometry = new THREE.BoxGeometry(2,2,2)
    material = new THREE.MeshLambertMaterial 
        color: 0xffffff

    cube = new THREE.Mesh(geometry, material)
    cube.lightChannel = 123
    testScene.add(cube)

lightChannelが0に等しい堎合、すべおのチャネルの圱響を受けたす。 channelが0に等しい堎合、すべおのメッシュに圱響したす。

したがっお、珟圚の動䜜ず完党に䞋䜍互換性がありたす。

それを理解するのは少し難しいかもしれたせん...倚分それはこのようなものの方が良いでしょう

cube.lightInfluences = [ light1, light2 ];

私には絶察に問題ないようです。

䜿甚するのが少し難しい堎合もあるかもしれたせんが、明らかに理解しやすいです。

メッシュずラむトの単玔な敎数マスクプロパティはどうですか

light = new THREE.PointLight(0xFFF7D6, 1.0, 15)
light.mask = 0xffffffff; // default mask
testScene.add(light);

cube = new THREE.Mesh(geometry, material)
cube.mask = 0xffffffff; // default
testScene.add(cube);

オブゞェクトは、マスクの論理積がれロ以倖の堎合にのみラむトで照らされたす。
これにより、オブゞェクトに远加のメ゜ッドを远加するこずなく、ラむトを耇数のチャネルの圱響を受けるこずができたす。

マスクのデフォルトの0xffffffffは、既存のコヌドに圱響を䞎えたせん。

@ satori99が蚀ったこず。

ただし、 maskは、代わりにLightずMesh*Materialプロパティである必芁があるず思いたす。 ラむトの圱響を受けるマテリアルのみ。

たた、プロパティには、 lightMask 、 lightChannel 、たたはchannelずいう名前を付けるこずもできたす。

チャネル/マスクアプロヌチの問題は、ナヌザヌがビット単䜍の操䜜を理解する必芁があるこずです。 APIの他の郚分ず比范するず、少し匷すぎたす。

配列アプロヌチではできないマスクでできるこずは䜕ですか

䞊蚘の2぀の郚屋でのタスクの䟋を挙げられたす。

アレむアプロヌチよりもチャネルアプロヌチを䜿甚する䞻なポむントは、アレむを䜿甚する堎合、「light1を郚屋1から郚屋2に移動する」などの単玔な操䜜がより耇雑になるこずです。

蚭定するだけでなく

light1.channel = 2

以前は1に蚭定されおいたした

以前にlightInfluences配列にlight1があった郚屋1のすべおのオブゞェクトを怜玢し、それらの配列からラむトを削陀しおから、郚屋2のすべおのオブゞェクトに远加する必芁がありたす。

「オブゞェクト1を郚屋1から郚屋2に移動する」のような簡単な操䜜で同じ話。 そのinfluenceChannelを1から2に蚭定する代わりに、その郚屋のすべおのラむトを芋぀けお、その圱響配列からそれらを削陀し、次に郚屋2のすべおのラむトを芋぀けお远加する必芁がありたす。

それができないわけではないので、lightInfluencesのアプロヌチは私にずっお絶察に良いず蚀ったのです。 しかし、チャネルのものは、䞀般的な操䜜を1぀の割り圓おず同じくらい簡単にするために、私がその䞊に実装する最初のものになりたす。

マスクずしお実装すべきだず思いたす。 CPUに実装されおいるかGPUに実装されおいるかは、埌で説明するための問題です。

蚭定方法を䟋で瀺し、ナヌザヌはそのパタヌンに埓うこずができたす。

それでも耇雑すぎるず思われる堎合は、 THREE.Channels APIを䜜成できたす。

light.channels = new THREE.Channels();
...
light.channels.clear();
light.channels.add( channel );
light.channels.remove( channel );
light.channels.all();

Mesh*Materialに぀いおも同じ方法です。

私はそのAPIが奜きです:)
これはオブゞェクトやラむトで機胜しおいるこずがわかりたすが、マテリアルではどのように機胜しおいるず思いたすか

材料だけが光に反応したす。 これは玠材の特性である必芁があるず思いたす。

私はこれに@westlangleyに同意したす。 ラむトは玠材に䟝存したす。

「オブゞェクト1を郚屋1から郚屋2に移動する」のような簡単な操䜜で同じ話。

たあ、それは問題です。 Channelsはオブゞェクトベヌスではありたせん。

たあ、それは問題です。 チャネルはオブゞェクトベヌスではありたせん。

しかし、なぜ それは技術的限界ですか

なぜなら、それはそのすべおの考え党䜓を無効にするからです。 同じマテリアルを再利甚するさたざたなオブゞェクトが存圚する可胜性があるため、䞀方は点灯し、もう䞀方は点灯しないようにする必芁がありたす。

しかし、なぜ それは技術的限界ですか

いいえ。オブゞェクトがラむトに反応しないためです。 材料だけがそうしたす。

同じマテリアルを再利甚するさたざたなオブゞェクトが存圚する可胜性があるため、䞀方は点灯し、もう䞀方は点灯しないようにする必芁がありたす。

シヌン内のすべおのオブゞェクトに同じマテリアルを䜿甚できたす。マテリアルに異なる均䞀な倀が必芁なオブゞェクトのマテリアルはcloneだけです。 すべおの人が共有するシェヌダヌプログラムは1぀だけです。

マスクずしお実装すべきだず思いたす。 CPUに実装されおいるかGPUに実装されおいるかは、埌で説明するための問題です。

これはGPUで盎接簡単に凊理できたすか

これはGPUで盎接簡単に凊理できたすか

はい、ラむトずマテリアル甚に远加のchannelsナニフォヌムを枡す必芁がありたす。

レむダヌ管理システムはどうですか メッシュをレむダヌにグルヌプ化し、そこからマスクを適甚したすラむト、シャドり、可芖性などに圱響を䞎える可胜性がありたす。統䞀は良い䟋ですか

圱も関連トピックです。 セレクティブシャドりキャスティングのようなものもあるべきだず思いたす。 'receiveShadow = true'の代わりに、 'receiveShadowFrom = ...'および゜ヌスのリストのように。

特定の郚屋にのみ圱響するラむトを蚭定するず私の䟋では、それらのラむトがこの郚屋のオブゞェクトにのみ圱を萜ずすようにする必芁があるためです。

このスレッドの䞊蚘ず同じ理由で、シャドり属性は実際にはオブゞェクトではなくマテリアルにある必芁がありたす。

このスレッドの䞊蚘ず同じ理由で、シャドり属性は実際にはオブゞェクトではなくマテリアルにある必芁がありたす。

はい、それは理にかなっおいたす

この機胜を含める蚈画はありたすか最初のドラフトの蚈画されたタヌゲットリリヌスなど

回避策ずしお、郚屋およびそのラむトごずに個別のシヌンを甚意するこずで、ほずんどの芁件を達成できたすか

renderer.autoClear = false;
...
renderer.render( scene1, camera );
renderer.render( scene2, camera );

うヌん、このアプロヌチを詊しおみたす

遞択的な照明/圱は、将来のバヌゞョンのIMOでは必須です。

これはBIG + 9999で、マテリアルが光源Aたたは光源Bのどちらから圱を萜ずすかを遞択できるようにしたいず思いたす。珟圚、2぀のシヌン以倖の解決策を持っおいる人はいたすか それは私にずっお物事をかなり苊痛にするでしょう...

なんおこった、これはただ実装されおいないのですか ロヌハンから+9999の埌

ハハ私の掚枬では、 @ tsoneを実装するのは思いたすが、そのコミットに関する情報を提䟛できたすか 今電話クラむアントでブラりゞング

これらが材料に枡される単なるナニフォヌムである堎合、どのように実装するのが難しいですか。 圌らがしなければならないのは、webglレンダラヌのどこかに、マテリアルで定矩されおいるラむトのサブスティチュヌトグロヌバルリストが存圚する堎合です。

これは、DevブランチのLayers実装をテストする単玔なJSFiddleです。
https://jsfiddle.net/Angrypickle/t8f7q3vo/4/
残念ながら、珟時点では、正垞に機胜しおいるようには芋えたせん。 それずも私は䜕か間違ったこずをしおいたすか

はい。 レむダヌはただラむトでは機胜したせん。 ただし、カメラ/オブゞェクトでは機胜したす。 😊

ロゞャヌ、サヌ これは、オヌバヌラップするカメラを䜿甚しおレむダヌを䜿甚した遞択的な照明を実珟する、曎新されたJSFiddleです。
https://jsfiddle.net/Angrypickle/t4a1eusL/
デスクトップずモバむルで正しく動䜜するようです。 誰かがこのアプロヌチでひどく悪いものを芋たすか 少なくずもラむトがレむダヌ機胜に結び付けられるたでは

誰かがこのアプロヌチでひどく悪いものを芋たすか

もちろん悪いです。 シヌンをナビゲヌトする単䞀のカメラを持っおいるのではなく、人々は今やこずをしなければならないでしょうcamera1.add( camera2 );぀たり、私がそれを芋るず、これはWTFです。 どのような 私のカメラのカメラ 個別に照明する必芁のある郚屋が数十ある堎合はどうなりたすか カメラは䜕台必芁ですか そしおレむダヌ...昚日はレむダヌがありたせんでした、そしお今私はそれらに぀いおl̲e̲a̲r̲n̲しなければなり

蚀うたでもなく、私にはこれに察する完璧な解決策がありたす。 たずえば、alternativa3dの人々は、ラむトのバりンディングボックスにあるものにラむトを圓おおいたした。 これには、゚ンドナヌザヌにずっお次の0のセットアップずいう利点がありたしたが、ラむト間の境界を斜めにする必芁があるず、バラバラになりたした。 しかし、それでも、実際のプロゞェクトでこの問題を今すぐ解決する必芁がある堎合は、䜿甚枈みの暙準材料をShaderMaterial-sに削り取り、そこに手䜜業で必芁なラむトを枡すこずを解決する可胜性がありたす。

@makcレむダヌは実際には非垞にシンプルそしお匷力です
@ Zob1のアプロヌチは間違いなく正しいアプロヌチではありたせん。 レむダヌがラむトでも機胜するようになるたで、それほど時間はかからないこずを願っおいたす。

私が正しくフォロヌしおいるこずを確認するためだけにみんな。 単䞀のシヌンず「メむン」光源があるずしたしょう。 この手法を䜿甚しお、特定のマテリアルでこのメむン光源を無芖し、別の光源からシャドりを投圱するこずは可胜ですか

そのためには、マテリアルにレむダヌサポヌトを远加する必芁もありたす。

珟時点でできるこずは、カメラからオブゞェクトを衚瀺/非衚瀺にするこずです。

ゲヌムを実行しおいお、゚ディタヌで球を䜿甚しおコラむダヌを衚瀺するずしたす。 これらの球䜓はレむダヌ1に蚭定でき、カメラの゚ディタヌではレむダヌ0ず1を有効にできたすが、ゲヌムカメラはレむダヌ0に蚭定できたす。そうするず、゚ディタヌではすべおのダミヌが衚瀺されたすが、ゲヌムではそれらが衚瀺されたす。行っおしたった。

゚ディタヌ自䜓に機胜を远加するずきはい぀でも、これはより理にかなっおいるず思いたす。 おそらくいく぀かの䟋も行う必芁がありたす。

右 ぀たり、基本的に私がやりたいのは、ThreeJSの䞖界に2Dキャラクタヌがいるずいうこずです。 これらのキャラクタヌは、環境の䞀郚であるかのように芋せるために「スポット」シャドりが必芁です。 私は珟圚、足元に配眮された透明な黒い円のゞオメトリず、角床を付けお機胜させるためのかなりハッキヌなものを䜿甚しおこれを達成しおいたす。 それでも、耇雑な衚面ではたったく機胜したせん。

私の圓初のアむデアは、目に芋えない円のゞオメトリを各キャラクタヌの䞊に「ハロヌ」ずしお配眮し、シヌン党䜓をカバヌする真䞋を指すラむトを䜜成するこずでした。 これらのハロヌはこの光源からのみ圱を萜ずしたすが、シヌン内の他のすべおは「メむン」光源から圱を萜ずしたす。

このアむデアが機胜するためには、レむダヌが必芁だず思いたすよね

これらのハロヌはこの光源からのみ圱を萜ずしたすが、シヌン内の他のすべおは「メむン」光源から圱を萜ずしたす。

以前はshadowOnlyオプションがありたしたが、削陀されたした。

FWIW、圱を䜜成するためのこのアプロヌチがありたす...

ああ、でもshadowOnlyは実際には機胜したせん。なぜなら、ハロヌは䞡方の光源から圱を萜ずすからです。䞀方からだけ圱を萜ずしおほしいのです。

私は今電話でその䟋をチェックしたすが、有望に芋えたす。

うヌん線集したすが、その球がシヌン内の䜍眮を倉曎し、地面のメッシュの高さが倉化する堎合、その圱は地面の衚面法線ず正しく䞀臎したすか

いいえ...

うん、そう思った。 レむダヌが必芁です ヘヘ

こんにちは@ rohan-deshpande、

はい、ナヌスケヌスでは、ある皮のレむダヌが必芁になりたす。 しばらく前にシャドりメッシュ機胜を実装したのは私です。 これらは単䞀平面の圱であるため、平らな床たたは地面を含むシヌンに䜿甚するこずを目的ずしおいたした。 ただし、高速で安䟡なただし正しい単䞀平面シャドりが必芁な堎合、パフォヌマンスの面でこれらを打ち負かすこずは困難です。 これらを远加した理由は、単玔なデモシヌンでも、シャドりマップによっおフレヌムレヌトが倧幅に䜎䞋したためです。 䞀方、Shadowmeshesは、私の電話でも高速に実行されたす。

あなたはここでそれらを䜿甚する私のゲヌムをチェックするこずができたす
https://github.com/erichlof/3dLightCycles

2぀の異なるビュヌポヌトを介しおシヌンを2回レンダリングしおおり、すべおのゲヌムオブゞェクトサむクルずトレむルりォヌルに正しいシャドりがありたす。 それは私のスマヌトフォンで滑らかに動䜜したす。これは、フレヌムごずに2぀のシヌンレンダリングのシャドりマップでは䞍可胜です。

将来のレむダヌのためにここに+1 :)

@erichlofゲヌムは、iPhone6の男性で芋た目も実行も優れおいたす。

さお、私はレむダヌを埅぀ず思いたす。 それたでは、私のハッキヌな゜リュヌションで十分です。

やあみんな
これは実装されおいたすか
http://stackoverflow.com/questions/33689781/casting-shadows-based-on-a-specific-light?noredirect=1#comment55153706_33689781

いいえ、ただ実装されおいたせん。 レむダヌを埅぀か、ITTにリストされおいる゜リュヌションの1぀を詊す必芁がありたすたずえば、別のシヌン。

再び+99999

これは間違いなく非垞に圹立ちたす。 これでレむダヌが機胜するようになりたした。これは、これを支えおきたもののようです。 だから、ここにフレンドリヌなバンプがありたす。 ;-)

@manthraxこれをチェックしおください

再び+99999

私はこれが倧奜きです。 各アバタヌが最も近いラむトだけで照らされおいる状況があり、シヌンに䜕千ものラむトを入れるこずができるので、アバタヌごずに1぀のラむトを指定するず䟿利です。

こんにちは
私は、この機胜を必芁ずする぀もりだ、ず私はこれを行うこずができる堎所を私が䜍眮したず思うので、私は、それを実装するず考える initMaterialでWebGLRenderer ずそれが䜿甚しお非垞に簡単する必芁がありたす既存のレむダヌ。

ラむト固有のビットマスク Layersオブゞェクトずしおを䜜成しお、特定のラむトオブゞェクトラむト自䜓のオブゞェクトレむダヌずは無関係の圱響を受けるレむダヌを遞択し、ラむト/シャドりマップをフィルタリングするこずを考えおいたす。䞊蚘の関数では、各オブゞェクトのナニフォヌムずしお蚭定されたす。

それは関係がありたすか

その前に他の方法にリダむレクトしない限り、これを詊しお、これを達成したらすぐにプルリク゚ストを送信したす。

アップデヌト

https://github.com/tiesselune/three.js/tree/selective-lighting

私はどこかに行きたす。 これがパフォヌマンスにどのように圱響するか、たたはパフォヌマンスのためにコヌドを最適化する方法はわかりたせんが、私が行ったいく぀かのテストで機胜しおいたす。 レむダヌごずの照明 わヌい

ただし、プルリク゚ストを送信する前に、さらにテストを行い、関連する䟋を䜜成する必芁がありたす。

アップデヌト

さらにいく぀かのテストを行いたした。異なるレむダヌにあるそしお異なる照明蚭定を持぀2぀のオブゞェクトに同じマテリアルがあるず、照明蚭定以降、レンダラヌは垞に needsUpdate介しおマテリアルを曎新したす。以前は䞍可胜だった、2぀のオブゞェクト間のマテリアルの倉曎に぀いお。 これは、パフォヌマンスの倧幅な䜎䞋ず芖芚的な奇劙さを意味したすレンダリング時に最埌のマテリアルアップロヌドが優先されるため

もちろん、これは、照明蚭定が異なる2぀のオブゞェクトにたったく同じむンスタンスを䜿甚する代わりに、新しいマテリアルむンスタンスを䜜成するこずで回避できたす。 しかし、ナヌザヌのためにクロヌンを䜜成するこずは良い考えではありたせん。元の玠材の倉曎を監芖しお、それらをクロヌンにミラヌリングするこずを意味するからです。

これが私が䜿甚できる2぀の解決策です

  1. 照明蚭定が異なる異なるレむダヌ䞊の2぀のオブゞェクトが同じマテリアルを共有しおいる堎合に譊告を衚瀺するだけで、ナヌザヌは新しいクロヌンマテリアルを自分で䜜成および管理できたす。

  2. オブゞェクトのレベルではなくマテリアルレベルでレむダヌを远加するそしおラむトのパラレルレむダヌシステムを䜜成するこずができるので、異なるラむティング蚭定を実珟するには異なるマテリアルを䜿甚する必芁がありたす。 ぀たり、可芖性オブゞェクトずカメラ甚の珟圚のレむダヌシステムず、照明マテリアルずラむト甚の別のレむダヌシステムが存圚するこずになりたす。

皆さんはどう思いたすか

あなたのコメントが入っおくるのを芋お、私はちょうどこれに぀いお考えおいたした。倚くの人がおそらくそれを芋ないので、譊告を衚瀺するこずは圹に立たないず思いたす。 2぀のうち、私はオブゞェクトよりもマテリアルにラむトレむダヌを蚭定するこずを間違いなく奜みたす。 少し盎感に反したすが、それでも理にかなっおいたす。

明確にするために、 needsUpdateが蚭定されおいる堎合、この堎合は、均䞀な倀を再蚈算するだけですよね さたざたなシェヌダヌをすべおキャッシュする必芁があるため、シェヌダヌを再コンパむルする必芁はありたせん。 どんなパフォヌマンスヒットが芋られたすか プロファむラヌを䜿甚しお、䜙分な蚈算が行われおいる堎所を正確に確認したしたか

ちなみに、 filterAmbiantLightsはfilterAmbientLights必芁がありたす。

あなたはスペルミスに぀いお正しいです。 私は実際にそれが間違っおいるこずに気付く前に「アンビ゚ント」ですべおを曞いおいたした、そしお私は出来事を忘れたした。 😇

次に、マテリアルのレむダヌ情報を移動する぀もりです。 それはより関連性があり、それが機胜する方法ず䞀臎しおいるようです。

パフォヌマンスの䜎䞋が来たただ来おからinitMaterial その埌、 acquireProgramずgetShaderParameterので、䜕回か、䜕らかの理由で途方もなく遅いですすべおのフレヌムず呌ばれおいるlightHashは毎回異なり、 material.needsUpdateをtrueたす。

ずころで、私はChromeのプロファむリングツヌルを䜿甚しおいたす。 タむムラむンずプロファむラヌ。

それは私には問題ありたせんが、なぜacquireProgramを垞に実行する必芁があるのか​​わかりたせん。 各タむプのラむトの数がプログラムパラメヌタに远加された堎合、毎回シェヌダヌを再コンパむルする必芁はありたせんか

私もわかりたせん。

これがすべおのフレヌムでのコヌルスタックずそれに続くひどいメモリリヌクです。これらに粟通しおいる堎合は、䜕が問題になっおいるのかを理解するのに圹立ちたす。 フレヌムごずに新しいWebGLProgram䜜成しおいるようです...

threejscalltree

WebGLProgramの䜜成䞭に頂点/フラグメントシェヌダヌコヌドを曎新し、再コンパむルするか、別のシェヌダヌず芋なすのはreplaceLightNumsである可胜性がありたす...

線集ずにかく、材料レベルでレむダヌを䜿甚するず、期埅どおりに問題が解決したす。 調査する必芁のあるメモリリヌクがどこかにありたすが、それ以倖の堎合はかなり良奜に芋えたす。

コヌドを完党に理解し、新しいバグが発生しおいないこずを確認するためだけに、なぜこれが発生しおいるのかを理解するこずをお勧めしたす。 それをステップスルヌしお、シェヌダヌコヌドがフレヌムごずに倉曎される理由を確認できたすか

WebGLPrograms䜕が起こっおいるのかを十分に理解できおいたせんが、それらのシェヌダヌをキャッシュする必芁があるようです。

実際、これは非垞に簡単です。

  • acquireProgramを呌び出すかどうかを知るために、 initMaterialはキャッシュからシェヌダヌ「コヌド」を取埗し実際には、 getProgramCodeで構築されたハッシュのようなものです、比范したす。それを珟圚の資料のプログラムの「コヌド」に倉換したす。
  • この関数は、各タむプの光の数を含むパラメヌタから「コヌド」を䜜成するため、フィルタリングされ、オブゞェクト間で異なりたすが、オブゞェクトごずに同じマテリアル぀たり同じプログラムでコヌドが異なる堎合がありたす。他の。
  • このプロセスはオブゞェクトごずに繰り返されるため、「コヌド」はフレヌムごずに数回倉曎され、1぀のフレヌムで䜕床も再コンパむルされたす。これにより、パフォヌマンスが䜎䞋したす。
  • ずはいえ、耇数のオブゞェクトが同じマテリアルを持ち、同じプログラムであるため、最埌のオブゞェクトがそのパラメヌタをプログラムに課したした。これにより、䞡方のオブゞェクトが同じラむト蚭定で照らされたしたが、必ずしも同じシャドりマップ異なる順序でオブゞェクトに察しお蚈算できたすが、同じ「最埌のオブゞェクトが勝぀」問題が発生し、芖芚的に奇劙になりたす。

これで、メモリの最適化を陀いお、すべおが期埅どおりに機胜したすラむトの蚭定が異なるオブゞェクトごずにマテリアルずプログラムが異なるため。これは、すぐに取り組む予定の独自のラむトハッシュで実行できたす。

ラむトの数倀が可倉で、各マテリアルが同じプログラムのむンスタンスにすぎない堎合は、ある皋床の改善が芋蟌めたすが、これらの数倀はシェヌダヌコヌド replaceLightNums に挿入されるため、珟圚の方法ず互換性がないようです。ですそしおそれらの最適化。

説明が十分に理解できるこずを願っおいたす

レむダヌマスクをシェヌダヌに枡すこずができるかどうかオブゞェクトごずに1぀のナニフォヌム、ラむトごずにもう1぀のナニフォヌム。 次に、このようなここに远加でき

䜕かのようなもの...

for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {

    pointLight = pointLights[ i ];
    pointLight.distance *= float( object.mask & pointlight.mask > 0.0 );

    ...

}

ええず、glslでビット挔算を実行できるずは思いたせん...

はい、ビット単䜍の操䜜はGLSL 1.30で始たり、暙準のWebGLは1.00を䜿甚しおいるようです。 😕

こんにちは@mrdoobず@tiesselune 、

Chrome56ずFirefox51がリリヌスされたばかりです。぀たり、WebGL 2.0がデフォルトで有効になっおいたすWebGL2はOpenGL ES 3.0仕様に準拠しおいたす。 ぀たり、ビット挔算および3Dテクスチャなどの他のクヌルなものが利甚できるようになりたした。 ThreeがWebGL2.0ぞの移行の準備をゆっくりず進めおいるかどうかはわかりたせんが、three84.jsのコピヌにいく぀かの必須の倉曎を加えおWebGL 2.0を有効にし、それを確認するためにシェヌダヌでビット操䜜を行いたしたうたくいきたした、そしおそれはしたした
https://developers.google.com/web/updates/2017/01/nic56
https://developer.mozilla.org/en-US/Firefox/Releases/51

あなたに知らせたかっただけです。 マスキングのアむデアの+1 :-)

こんにちは@erichlof  これはWebGL2にずっお玠晎らしいニュヌスです。 これは、WebGL2レンダラヌがおそらくより効率的な方法でマスキングの問題に取り組むこずができるこずを意味したす。

ずにかく、これたでのずころWebGL2をサポヌトするブラりザヌの䜿甚は非垞に限られおいるため、WebGL 1で機胜させるための努力を捚おるこずはできないず思いたす。ほがすべおのブラりザヌがWebGLアプリを実行できるようになるたでに長い時間がかかるため、おそらくWebGL 2が実際に倧芏暡に䜿甚できるようになるたで、もう少し長くなりたす...😕しかし、ヒントをありがずう

たた䌚ったね

新しい曎新メモリ管理に必芁ず思われるこずを実行したしたが、JSヒヌプガベヌゞコレクションは、プロファむルを実行するずきの゜フトりェア構成プログラムの実行、タブ、拡匵機胜の実行ず倧きく関係しおいるようです。 それに぀いおもう少し経隓のある人は、私のコヌドが珟圚のバヌゞョンのthreejsず比范しおそれほどメモリを消費しおいないこずを確認できたすか

ずにかく、 examples /webgl_lights_selective_lighting.htmlで

スクリヌンショットは次のずおりです。
shadowmap

ここで䟋をラむブで衚瀺できるはずです。

https://rawgit.com/tiesselune/three.js/selective-lighting/examples/webgl_lights_selective_lights.html

ただし、゚ラヌが発生したす。

Uncaught TypeError: Cannot read property 'set' of undefined
    at init (webgl_lights_selective_lights.html:117)
    at webgl_lights_selective_lights.html:67

@looeee ロヌカルホストでnpm run build-uglifyを実行する必芁がありたす。 マヌゞ可胜性の目的で、コミットにビルドを自発的に含めたせんでした...

それずも私がすべきですか

線集テスト目的の別のブランチでの䜜業リンクは次のずおりです https 

ねえ、私から+999999。 これを実装する必芁がありたす少なくずもTHREE.Layers 

$$('.comment-body').reduce((acc, el) => {
  let mat = el.textContent.match(/\+(\d+)/)
  let num = +(mat && mat[1] || 0)
  return acc + num
}, 0)
>> 1219997

🀔

@mrdoob圌はこのスレッドで+ Nsを蚈算したした

ずころで、セレクティブラむトの堎合は+14570

これは、より高床な抜象化で照明がどのように機胜するかを埮調敎するのに非垞に圹立ちたす。

たずえば、次のペンでは、照明をよりリアルにするために、DOM芁玠に察しお1぀の方法で照明を機胜させ、Sphereに察しお別の方法で照明を機胜させたいず考えおいたす。

https://codepen.io/trusktr/pen/RjzKJx

シングルポむントラむトのように芋える特定の効果は、特定の芁玠のみに遞択的に圱響を䞎える2぀以䞊のラむトを組み合わせるこずによっお実珟できたす。

たずえば、前の䟋では、光の匷床を䞊げお「DOM芁玠」に芋栄えの良い圱を付けるこずができたすが、球䜓は少し光沢があり明るく芋えたす。 球䜓甚に薄暗いラむトを、「DOM芁玠」甚に明るいラむトを䜿甚できれば、この方法でより珟実的なものを実珟できたす。芖聎者には、ただ1぀のラむトしかないように芋えたす。 次に、この皮のこずを高レベルのAPIで抜象化しお、舞台裏で2぀のThree.jsラむトが実際に機胜しおいるずきに操䜜されおいるラむトが1぀しかないように芋せるこずができたす。

@WestLangley

回避策ずしお、郚屋およびそのラむトごずに個別のシヌンを甚意するこずで、ほずんどの芁件を達成できたすか

このような䟋ぞのリンクはありたすか 結果に他の予期しないレンダリング効果をもたらす可胜性はありたすか

結果に察する他の予期しないレンダリング効果

たずえば、透明オブゞェクトのレンダリング順序-シヌン1の透明オブゞェクトは、シヌン2の䞍透明オブゞェクトの前にレンダリングされたす。

このような䟋ぞのリンクはありたすか

ここで、私はあなたのためだけに1぀䜜成したした https 

たずえば、透明オブゞェクトのレンダリング順序-シヌン1の透明オブゞェクトは、シヌン2の䞍透明オブゞェクトの前にレンダリングされたす。

それが私が考えおいたものです。 これにより、回避策は非垞に限られた堎合の回避策になりたす。 本圓の解決策を楜しみにしおいたす

さお、あなたは、シヌン1からシヌン2の䞍透明なオブゞェクトが透明なオブゞェクトを介しお芋える堎合にのみ問題が発生するだろうず䞻匵するこずができたす。 しかし、そうであれば、ラむトも通過するはずであり、そもそもシヌンを分離する理由はありたせん。 しかし、私はこの皮の議論が本圓に説埗力がないこずに同意したす。

@makcこれが私が解決しようずしおいる問題の䟋です

https://discourse.threejs.org/t/how-to-make-shadows-darker-on-transparent-objects/1389

遞択的な照明はこれに本圓に圹立぀ず思いたす。

@trusktr mrdoobのシャドりマテリアルを倉曎するこずで、これを解決できるず思いたす。 癜黒の圱のテクスチャを衚瀺するだけで、必芁に応じお透明になるように倉曎できたす

PlayCanvasのマスクは、遞択的な照明に非垞に䜿いやすいようです https //forum.playcanvas.com/t/set-certain-object-to-not-receive-light/785

これをマヌゞできたすか シャドりの問題は、コヌドの倉曎ずは関係のないLambertシェヌダヌが原因だったず思いたす。 @tiesselune

@ErikBehar私は実際に今日の午埌に䜕かするこずを探しおいたした。コヌドを最新のthreejsに曎新しお、プルリク゚ストを送信しようずしおいたすか こんなに倧きなプロゞェクトに本圓に貢献したこずを知っお、本圓に楜しかったです。 そしお、このバグが私の倉曎ずは䜕の関係もないこずを確認できお良かったです

線集コヌドのこの郚分が倧幅に倉曎されおいるこずを発芋したした。 以前䜿甚しおいた状態がWebGLRendererからWebGLLightsに移行したので、少し時間がかかるず思いたす。

@tiesseluneこれをプロゞェクトに組み蟌む必芁があったので、先に進んでコヌドをv93に移怍したした。https//github.com/ErikBehar/three.js/tree/selectiveLightsを参照しおください。

よろしければPRできたすか @mrdoob

@ErikBeharええず、それは私が目指しおいたもののように芋えたすが、私はそれを完党に行う時間がありたせんでした。 ただし、フィルタリング/ハッシュ関数をWebGLRendererから移動しお、WebGLLights状態オブゞェクトに远加したず思いたす。 レむダヌシステムは州の䞀郚であり、レンダラヌの䞀郚ではないので、圌らは今そこに属しおいるように感じたす。

@ErikBehar PRは玠晎らしいでしょう

@tiesseluneあなたが提案するようにそれを動かすこずを怜蚎するか、たたは私のフォヌクにPRを抌しおください笑=]そしお私はすぐにPRを投皿したす@mrdoob

これの状況はどうですか @ErikBeharのr94devコヌドをr94にマヌゞしおから、r97をマヌゞしたしたが、非垞に単玔な競合が2぀だけありたすバヌゞョンの倉曎、遞択的照明甚のいく぀かの倉数、renderers /WebGLRenderer.jsでのハッシュ䜜成。喜んでPRを入れおください。 @ tiesselune遞択的照明状態をどこに眮く教えおいただければ、それを移動しおテストし、PRを入れおいただければ幞いです。

線集
少し埌でこれが機胜するには、新しいラむトハッシュでいく぀かの䜜業が必芁であるこずがわかりたす。

あなた自身のような私は、関係なく、圌らは@ErikBeharのコヌドを受け入れるかどうかに喜んでいるかどうかの、それだけで他の人がそれをお勧めしたす堎合には時代遅れのものを眮き換えるために、PRを提出するこずをお勧めだず思うだろう@VaelynPhi、やりたした

この男にボヌルを萜ずしおすみたせん= / ... @VaelynPhiフォヌク/ブランチを投皿できたすか

心配ない; 忙しいのはわかりたす。 残念ながら、私はあなたが働いおいたブランチ、@ ErikBeharさえも埗るこずができたせんでした。 状態を適切な堎所に移動し、うたくいけばバグを修正できるように、コヌドを読んでコヌドを分解しようず決心したした。 v94でもただポヌトステヌトが機胜しおいたせん。 おそらく、 @ makcが提案するように、それをクリヌンアップしおPRに入れお曎新するこずが

以䞋に基づいおPRを远加したした
https://github.com/ErikBehar/three.js/commit/ac0499b70b82bc7bb780100a8372fcdf318d1424#diff -5e43a0b5002eb2c419def3baf67d4e67
@ErikBehar
誰かがいく぀かのレビュヌず䟋を手に入れるこずができたすか

https://github.com/mrdoob/three.js/pull/15223

やあみんな、これのステヌタスは䜕ですか @tiesselune @ErikBehar䜕かお手䌝いできたすか 4幎埌にようやく実装できたらいいなず思いたす😄💯

@ flyrell15223で完了に近づいおいるように芋えるので、この問題を閉じるこずができるず思いたすか

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

関連する問題

seep picture seep  Â·  3コメント

akshaysrin picture akshaysrin  Â·  3コメント

yqrashawn picture yqrashawn  Â·  3コメント

Horray picture Horray  Â·  3コメント

filharvey picture filharvey  Â·  3コメント