2014-04-20 14 views
8

Od jakiegoś czasu staram się dowiedzieć, jak zrobić zarys zaznaczania obiektów w mojej grze. (Tak więc gracz może zobaczyć obiekt nad wszystko inne, na myszy-over)Obiekt obrysu (skala normalna + maska ​​szablonu) three.js

ten sposób wynik powinien wyglądać:

enter image description here

Rozwiązanie Chciałbym użyć idzie tak:

  1. Warstwa 1: Narysuj model w regularnym cieniowaniu.
  2. Warstwa 2: Narysuj kopię w kolorze czerwonym, przeskalowaną wzdłuż normalnych za pomocą narzędzia do cieniowania werteksów.
  3. Mask: Narysuj czarny/biały płaski kolor modelu, aby użyć go jako maska ​​wzornik dla drugiej warstwy, aby ukryć wnętrze i pokazać warstwę 1.

I tu pojawia się problem. Nie mogę znaleźć żadnych dobrych materiałów edukacyjnych na temat masek. Czy mogę odjąć wnętrze od kształtu obrysu? Co ja robię źle?

Nie mogę wymyślić, jak ułożyć moje przejścia do renderowania, aby maska ​​działała. :(

Oto jsfiddle demo

renderTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, renderTargetParameters) 

composer = new THREE.EffectComposer(renderer, renderTarget) 
// composer = new THREE.EffectComposer(renderer) 

normal  = new THREE.RenderPass(scene, camera) 
outline  = new THREE.RenderPass(outScene, camera) 
mask  = new THREE.MaskPass(maskScene, camera) 
// mask.inverse = true 
clearMask = new THREE.ClearMaskPass 
copyPass = new THREE.ShaderPass(THREE.CopyShader) 
copyPass.renderToScreen = true 

composer.addPass(normal) 
composer.addPass(outline) 
composer.addPass(mask) 
composer.addPass(clearMask) 
composer.addPass(copyPass) 

Także nie mam pojęcia, czy użyć renderowanie cel lub renderujący dla źródła kompozytora. :(Mam mieć pierwszą przepustkę kompozytora w ogóle Dlaczego muszę przekazać kopię? Tak wiele pytań, wiem. Ale tam po prostu nie są wystarczające zasoby, aby dowiedzieć się od, byłem googlowania dni.

Dzięki za wszelkie rady!

+2

Może alternatywnym podejściem będzie pracować dla Ciebie: http://stackoverflow.com/questions/17739760/complex-shape-character-outline/21863009#21863009 – WestLangley

+0

@WestLangley Oh, wow. Całkowicie tego nie zauważyłem. To wygląda tak, jak potrzebuję tego. Wypróbuję to. Po prostu nie mogę ci wystarczająco podziękować! Cieszę się, że często przepełniasz stos. – Eskel

+0

@WestLangley Przy bliższym przyjrzeniu mi się to nie pomaga. Musiałbym skopiować nie tylko obiekt do drugiej sceny, ale także wszystkie dynamiczne światła, które dodałyby wiele narzutów. Wszystko, aby narysować cały obiekt przed innymi, co nie jest nawet tym, czego chciałem na pierwszym miejscu. Naprawdę muszę narysować tylko kontur, który oznacza, jak działa maskowanie. Albo użyj jakiegoś filtra rastrowego. – Eskel

Odpowiedz

15

Oto a js fiddle z rozwiązaniem roboczym. Nie ma za co. :)

http://jsfiddle.net/Eskel/g593q/6/

Aktualizacja z tylko dwóch renderowanie pasuje (kredyt WestLangley): http://jsfiddle.net/Eskel/g593q/9/

Kawałki brakuje były takie:

composer.renderTarget1.stencilBuffer = true 
composer.renderTarget2.stencilBuffer = true 
outline.clear = false 
+1

Nice! Nie potrzebujesz 3 kamer (przynajmniej w tym demo), a kamery nie muszą być dodawane do sceny (scen). Ponadto, przypisując człony, można pominąć aktualizację obrotów 2 oczek w pętli renderowania. Zobacz http://jsfiddle.net/g593q/7/ – WestLangley

+0

@WestLangley Nice! Właśnie próbowałem rozgryźć tę część rotacji. Wielkie dzięki. :) Teraz ostatnią rzeczą do rozwiązania są dane animacji kości z jednej siatki ze skórą na drugą. – Eskel

+0

Proszę napisać nowy post, jeśli masz nowy problem. – WestLangley