Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WebGL / WebVR for FrontEnd Engineer
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
yomotsu
February 25, 2017
Technology
4.8k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WebGL / WebVR for FrontEnd Engineer
yomotsu
February 25, 2017
More Decks by yomotsu
See All by yomotsu
three.jsとRapierでレースゲームが3日でできた話
yomotsu
0
900
PBR in three.js
yomotsu
1
1.4k
dialog要素でつくるモーダルダイアログ
yomotsu
0
1.1k
IE to Edge
yomotsu
1
410
A Camera Control Library for three.js
yomotsu
1
1.5k
Let’s try AR on mobile Web with <model-viewer>
yomotsu
0
600
WebXR: Beyond WebGL
yomotsu
2
1.9k
Non-DOM components with WebGL in Vue.js
yomotsu
5
13k
WebGL Libs for WebApp Frameworks
yomotsu
4
7.9k
Other Decks in Technology
See All in Technology
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
6.8k
名古屋の市バスGTFS-JPデータ×スガキヤ 最寄りバス停検索をAmazon ElastiCache Serverless for Valkeyで最適化する
usanchuu
1
500
新しい SLO が良い感じにハマっている話
z63d
5
2.1k
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
QAエンジニア起点で進める、SmartHRにおける信頼性向上について
kaomi_wombat
1
120
Software Supply Chain Attackからクラウド環境を守るためにできること
lhazy
2
220
DatadogのBits Chatが開発組織にもたらしたもの / What Bits Chat Has Brought Us
sms_tech
0
110
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
6
1k
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
12
8.4k
【Google Cloud Next Tokyo'26】Gemini Enterprise と Oracle AI Database で実現する、業務データ活用を実現する AI エージェント実装
shisyu_gaku
0
230
変化の早いClaude Codeを 書籍に落とし込む
oikon48
7
1.3k
20分でわかるセキュアAPI
nwiizo
1
190
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
1
3.8k
Discover your Explorer Soul
emna__ayadi
2
1.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
200
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
360
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
270
We Have a Design System, Now What?
morganepeng
55
8.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The SEO identity crisis: Don't let AI make you average
varn
0
530
Building Applications with DynamoDB
mza
96
7.2k
Balancing Empowerment & Direction
lara
6
1.2k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1.1k
Transcript
WebGL / WebVR for FrontEnd Engineer Presented by Akihiro Oyamada
(@yomotsu) Feb 25, 2017
Frontend Engineer at PixelGrid, Inc. Akihiro Oyamada @yomotsu
I don’t talk about WebVR much… Disclaimer...
None
http://yomotsu.net/blog/assets/2016-12-25-xmas/ http://www.welcometofillory.com/ https://plus360degrees.com/uxcars/ http://www.playkeepout.com/
Almost native app looks! Cuz it works on top of
native graphic APIs
None
Sounds difficult? There are libraries!
None
Pros • Strong and large community • Docs and examples
• JS friendly easy APIs • Low level WebGL access Cons • Doesn't follow semver, Breaking changes sometime • Tricky garbage collection
None
None
None
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(
60, width / height, 1, 1000 ); camera.position.set( 0, 0, 5 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( width, height ); document.body.appendChild( renderer.domElement ); var light = new THREE.HemisphereLight( 0x443333, 0x332222, 2 ); scene.add( light ); var geometry = new THREE.SphereGeometry( 2, 2, 2 ); var material = new THREE.MeshPhongMaterial( { color: 0xff0000 } ); var mesh = new THREE.Mesh( geometry, material ); scene.add( mesh ); renderer.render( scene, camera );
let’s move onto the main topics for today
• Avoid unnecessary rendering • Reduce drawcalls • Avoid frequent
texture uploading • Consider to use GPU • Compress 3D assets
Avoid unnecessary rendering
Continuously re-rendering Better
demo 19 http://localhost:8000/1_re-rendering/bad.html http://localhost:8000/1_re-rendering/better.html
( function anim () { requestAnimationFrame( anim ); renderer.render( scene,
camera ); } )(); Re-rendering may unnecessary
window.addEventListener( 'resize', function () { const width = window.innerWidth; const
height = window.innerHeight; camera.aspect = width / height; camera.updateProjectionMatrix(); renderer.setSize( width, height ); renderer.render( scene, camera ); // <- don't do this! } ); Re-rendering may unnecessary
( function anim () { requestAnimationFrame( anim ); if (
!myApp.needsUpdate ) { return; } renderer.render( scene, camera ); } )(); Pass re-rendering if unnecessary
var prevPosition = new THREE.Vector3(); var checkCameraPosition = function ()
{ if ( !approximatelyEqual( camera.position, prevPosition ) ) { myApp.needsUpdate = true; } prevPosition.copy( camera.position ); }; Checking “needsUpdate”
window.addEventListener( 'resize', function () { const width = window.innerWidth; const
height = window.innerHeight; camera.aspect = width / height; camera.updateProjectionMatrix(); renderer.setSize( width, height ); myApp.needsUpdate = true; // for next rAF } ); Checking “needsUpdate”
Reduce drawcalls
Continuously repainting Better 8 drawcalls 1 drawcall
demo 27 http://localhost:8000/2_texture-atlas/1_house1.html http://localhost:8000/2_texture-atlas/2_house2.html
.FSHFNBUFSJBMT
3 drawcalls for 3 objects 1 drawcall 3 objects
demo 30 http://localhost:8000/2_texture-atlas/3_house-multi1.html http://localhost:8000/2_texture-atlas/4_house-multi2.html http://localhost:8000/2_texture-atlas/5_house-multi3.html
var houseGeometry = ...; var houseGeometry2 = ...; houseGeometry2.applyMatrix( new
THREE.Matrix4().makeTranslation( -10, 0, 0 ) ); houseGeometry.merge( houseGeometry2 ); Merge geometries
Avoid frequent texture uploading
None
demo 34 http://localhost:8000/3_spriteAnim/bad.html http://localhost:8000/3_spriteAnim/better.html
None
None
$16BOE(16 BSFQIZTJDBMMZTFQBSBUFE
( function anim () { var elapsed = clock.getElapsedTime(); requestAnimationFrame(
anim ); texture.image = images[ frame ]; texture.needsUpdate = true; renderer.render( scene, camera ); frame = ( elapsed * 20 % images.length ) | 0; } )(); Bad: Replacing image
( function anim () { var elapsed = clock.getElapsedTime(); requestAnimationFrame(
anim ); texture.offset.set( frame % frameCol / frameCol, ( frameRow - 1 ) / frameRow - ( ( frame / frameCol ) | 0 ) / frameRow ); renderer.render( scene, camera ); frame = ( elapsed * 20 % frameLength ) | 0; } )(); Better: Use UV offset
None
var rtt = new THREE.WebGLRenderTarget( 512, 512, { minFilter: THREE.LinearFilter,
magFilter: THREE.NearestFilter, format: THREE.RGBFormat } ); renderer.render( sceneRTT, cameraRTT, rtt, true ); RTT
GPU may be utilised
None
demo 44 http://localhost:8000/4_particle/bad.html http://localhost:8000/4_particle/better.html
requestAnimationFrame( anim ); for ( var i = 0, l
= particleLength; i < l; i ++ ) { if ( geometry.attributes.position.array[ i * 3 + 1 ] > - boxHeight * 0.5 ) { geometry.attributes.position.array[ i * 3 + 1 ] -= delta; } else { geometry.attributes.position.array[ i * 3 + 1 ] = boxHeight * 0.5; } }; geometry.attributes.position.needsUpdate = true; Calc in CPU
uniform float time; uniform float height; uniform float scale; void
main () { vec3 pos = vec3( position.x, position.y - time * 1.0, position.z ); pos.y = mod( pos.y, height ) - ( height * 0.5 ); vec4 mvPosition = modelViewMatrix * vec4( pos, 1.0 ); gl_Position = projectionMatrix * mvPosition; gl_PointSize = 1.0; } Calc in GPU (Shader)
Compress 3D assets
3D Model file consists of mostly numbers
3D scanned(ish) Model file
http://localhost:8000/5_compress/bad.html
None
Save 70% of size!
None
zip is an archive format
Multiple files in one zip file
• Contains multi files • Compressed One file • Arrows
you to make a progressive bar • UnZip JS libs are available on GitHub
None
None
https://opensource.googleblog.com/2017/01/introducing-draco-compression-for-3d.html As of Jan 13, 2017
• Compressing lib for 3D assets • Developed by Google
• Decompressor is available in JS (but 800kb emscripten) Might be still early…?
Conclusion
WebGL is… • Click, then it will open • No
installing, but loading • Devices/Browsers are unspecified
• Write your code efficiently • CPU and GPU are
separated • Compress 3D assets Conclusion
WebVR?
https://www.youtube.com/watch?v=cBvCS78ZC1c
https://w3c.github.io/webvr/
Navigator.getVRDisplays() params and states
Navigator.getVRDisplays() params and states •d[ i ].VREyeParameters •FOV •offset (eye
transition) •d[ i ].getPose() •position •orientation (quaternion) and etc…
WebVR is a small API!
None
None
One more thing
None
... mounted () { const scene = this.getScene(); scene.add( this.mesh
); }, beforeDestroy () { const scene = this.getScene(); // optional // this.mesh.material.map.dispose(); // this.mesh.geometry.dispose(); // this.mesh.material.dispose(); scene.remove( this.mesh ); },
WebGL can be used with WebApp frameworks!
for FrontEnd Engineer Presented by Akihiro Oyamada (@yomotsu) Feb
25, 2017 WebGL / WebVR
three.js for FrontEnd Engineer Presented by Akihiro Oyamada (@yomotsu) Feb
25, 2017
gl.finish(); @yomotsu
Ξϯέʔτʹ ͝ڠྗ͍ͩ͘͞ http://bit.ly/2meQNnL gl.finish(); @yomotsu