Three.js: Safari/IOS์˜ HLS๊ฐ€ ์ด์ œ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2016๋…„ 09์›” 23์ผ  ยท  210์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์—†๋‹ค๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ํ…Œ์ŠคํŠธ์—์„œ HLS๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋งค์šฐ ํ™•์‹ ํ•˜๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ ์ง€๊ธˆ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ CORS ํ”„๋ก์‹œ ํ•ดํ‚น์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ CORS๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WebView IOS ์•ฑ์—์„œ CORS ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋ Œ๋”๋ง์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

WebGL์—์„œ HLS ๋ Œ๋”๋ง์„ ์–ป๊ธฐ ์œ„ํ•ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” WebGL ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋„์›€์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์บ”๋ฒ„์Šค ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” drawImage๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ”„๋ ˆ์ž„์„ ์–ป๊ธฐ ์œ„ํ•ด ์บ”๋ฒ„์Šค์˜ ์ด์ค‘ ๊ทธ๋ฆฌ๊ธฐ์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ Mp4 ํŒŒ์ผ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋Š” ์—ฌ๊ธฐ

http://dev.electroteque.org/threejs/

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚ด์žฅ ์…ฐ์ด๋”๋ฅผ ํ•ดํ‚นํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์šฉ์ž ์ง€์ • ์…ฐ์ด๋”๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž! ๐Ÿ˜€

const WIDTH = window.innerWidth;
const HEIGHT = window.innerHeight;

var camera = new THREE.PerspectiveCamera( 75, WIDTH / HEIGHT );

var scene = new THREE.Scene();

// geometry

var geometry = new THREE.SphereGeometry( 1, 32, 16 );

// material

var loader = new THREE.TextureLoader();
var texture = loader.load( 'https://threejs.org/examples/textures/2294472375_24a3b8ef46_o.jpg');

// material

var material = new THREE.ShaderMaterial( {
    uniforms: {
        texture: new THREE.Uniform( texture )
    },
    vertexShader: [
        "varying vec2 vUV;",
        "void main() {",
        "   vUV = vec2( 1.0 - uv.x, uv.y );", // fipY: 1.0 - uv.y
        "   gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
        "}"
    ].join( "\n" ),
    fragmentShader: [
        "uniform sampler2D texture;",
        "varying vec2 vUV;",
        "void main() {",
        "   gl_FragColor = texture2D( texture, vUV ).bgra;",
        "}"
    ].join( "\n" ),
    side: THREE.BackSide
} );

var mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );

var renderer = new THREE.WebGLRenderer();
renderer.setSize( WIDTH, HEIGHT );
document.body.appendChild( renderer.domElement );

function animate( time ) {
    requestAnimationFrame( animate );
    mesh.rotation.y = time * 0.0001;
    renderer.render( scene, camera );
}

animate();

https://jsfiddle.net/9jy92zxn/

๋ชจ๋“  210 ๋Œ“๊ธ€

ํ”„๋ ˆ์ž„์„ ๋–จ์–ด๋œจ๋ฆฌ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์บ”๋ฒ„์Šค ๋ Œ๋”๋Ÿฌ๋กœ ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆฌ๊ณ  ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. webgl์— ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•„๋ฆ„๋‹ค์›€์ž…๋‹ˆ๋‹ค. ํ”„๋ก์‹œ๋œ HLS ์ŠคํŠธ๋ฆผ์œผ๋กœ kpano ๋ฐ๋ชจ๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ Safari OSX์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ IOS 9์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ์•„์‹ญ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์Šฌํ”„๊ฒŒ๋„ webgl ํ”Œ๋ž˜๊ทธ๋‚˜ ๊ทธ๋“ค์ด ํ•˜๋Š” ์ผ์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. IOS9์—์„œ๋Š” ์—ฌ์ „ํžˆ ๊ฒ€์€์ƒ‰ ํ”„๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.

http://dev.electroteque.org/threejs/webgl.html

์ด ๋งˆ์ง€๋ง‰ ๋งํฌ๋Š” ๊ฒ€์€์ƒ‰ ์‚ฌ๊ฐํ˜•/์‚ฌํŒŒ๋ฆฌ 9.1.3/mac os x 10.11.6์—์„œ๋งŒ ์‚ฌ์šด๋“œ์ž…๋‹ˆ๋‹ค.

HLS๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@makc ์ •๋ง? ์ €๋Š” OSX 10.10๊ณผ Safari 10์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Apple์˜ ์ตœ๊ทผ ๋ฐฉํ•ด ํ–‰์œ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Safari 10. ์šฐ๋ฆฌ๊ฐ€ Safari 10์ด๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ์ข‹์Šต๋‹ˆ๋‹ค.

@mrdoob HLS = ์• ํ”Œ ์ŠคํŠธ๋ฆฌ๋ฐ. ์ฆ‰, ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ๋ฟ ์•„๋‹ˆ๋ผ VOD๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์€ Terradeck ์žฅ๋น„์™€ ํ•จ๊ป˜ ํ‘œ์ค€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ: http://dev.electroteque.org/video/360/hls/ultra_light_flight.m3u8

์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋ณ€๊ฒฝํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ์›์‹œ webgl ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ texImage2D๋Š” HLS๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜์ง€๋งŒ IOS์—์„œ๋Š” ์•„์ง ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ Safari 10์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ์š”?

๋ช‡ ๊ฐ€์ง€ ์›นํ‚ท ๋ฒ„๊ทธ ํ‹ฐ์ผ“์— ๋Œ€ํ•ด ๋ณด๊ณ ํ•œ ๊ฒƒ์„ ์šฉ์„œํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

๊ทธ๋“ค์€ ๊ฐ€์„œ IOS ์—…๋ฐ์ดํŠธ์—์„œ CORS ํ”„๋ก์‹œ ํ•ดํ‚น์„ ๋ฐฉํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. macOS๋Š” Safari์—์„œ๋„ CORS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์ œ ๊ทธ๋“ค์˜ ๋ฐฉํ•ด ๊ณต์ž‘์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IOS์—์„œ ์ž‘๋™ํ•˜๋Š” HLS๋ฅผ ์ถ”๊ฐ€๋กœ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ํ•ด๋‹น ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ์ด ์ง„์‹ฌ์œผ๋กœ ๋ถˆ์„ ๋„๋Š๋ผ ๋•€ ํ˜๋ฆฌ๊ฒŒ ํ•˜๋„ค ใ…‹ใ…‹ใ…‹ใ…‹

๋‚ด๊ฐ€ OSX ๋ Œ๋”๋ง์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ์‹œ์ž‘์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. three.js์—์„œ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€ ์•Œ์•„๋‚ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์ถ•์†Œ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜๋ฉด IOS๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ three.js ๋‚ด์˜ ์ถ”๊ฐ€ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์ด ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ผ๊นŒ์š”? ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ€๋กœ ์ง€๋ฅด์ง€ ์•Š์ง€๋งŒ ์›์‹œ webgl ์˜ˆ์ œ์—์„œ three.js๊ฐ€ ํ•ด๋‹น equirectangular ์˜ˆ์ œ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๋ณต์ œํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์˜ˆ์ œ ์…ฐ์ด๋” ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์—์„œ three.js๊ฐ€ ํ•˜๋Š” ์ผ์„ ์™„์ „ํžˆ ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋Š” ์›์‹œ ํ•จ์ˆ˜๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ณ€์ˆ˜๋Š” ์„ธ๊ณ„ ์œ„์น˜์™€ ๊ฐ™์ด ์™ธ๋ถ€์ ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์„ ์ง์ ‘ ๋ณต์‚ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

https://bl.ocks.org/mbostock/5446416

๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ ๋˜๋Š” ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. S3 ๋ฒ„ํ‚ท์— h264 mp4 ํŒŒ์ผ์ด ์žˆ๊ณ  blob์œผ๋กœ video.src์— ๋กœ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Amazon ์›น ๊ธฐ๋ฐ˜ ์—…๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ S3 ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•˜๋ฉด Mobile Safari(iOS 10.0.1)์—์„œ ์ง์ ‘ ๋กœ๋“œํ•  ๋•Œ ๋™์˜์ƒ์ด ์ œ๋Œ€๋กœ ์žฌ์ƒ๋˜์ง€๋งŒ three.js ๋ทฐ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์˜์ƒ์„ ์žฌ์ƒํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ฒ€์€ ํ™”๋ฉด. ๊ทธ๋Ÿฌ๋‚˜ Cyberduck์œผ๋กœ S3 ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•˜๋ฉด Mobile Safari์™€ three.js์—์„œ ์ง์ ‘ ์ œ๋Œ€๋กœ ์žฌ์ƒ๋ฉ๋‹ˆ๋‹ค.

Cyberduck์ด ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ 'Content-Type=video/mp4'๋ฅผ ์„ค์ •ํ•˜๊ณ  AWS ์—…๋กœ๋”๊ฐ€ 'Content-Type=application/octet-stream'์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋””์˜ค/mp4๋กœ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒํ•œ ๋ฌธ์ œ, ๊ทธ๋ฆฌ๊ณ  ๋‚˜์—๊ฒŒ ๋งŽ์€ ๋จธ๋ฆฌ๋ฅผ ๊ธ์  ๊ฑฐ๋ฆฌ๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด ํ‹ฐ์ผ“๊ณผ ๊ฐ™์€ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌ ํ•ด์š”,
๋”์Šคํ‹ด

์ด๊ฒƒ์€ mp4๊ฐ€ ์•„๋‹Œ mpegts ์กฐ๊ฐ ๋˜๋Š” ์กฐ๊ฐ๋‚œ ํŒŒ์ผ์—์„œ์™€ ๊ฐ™์ด HLS ๋ฉ”์ดํŠธ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Mp4๋Š” Safari์™€ IOS ๋ชจ๋‘์—์„œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Cyberduck์—์„œ MIME ์œ ํ˜•์„ ํ™•์ธํ–ˆ๊ณ  mpegts๊ฐ€ ์ •ํ™•ํ•˜๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  IOS๊ฐ€ ์•„๋‹Œ ์›์‹œ webgl ์˜ˆ์ œ์—์„œ ๋™์ผํ•œ ์ŠคํŠธ๋ฆผ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฌธ์ œ๋Š” ๊ฒ€์€ ์ƒ‰ ํ”„๋ ˆ์ž„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‚˜์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์ด ์ „ํ˜€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@danrossi ok ๋ฉ‹์ ธ์š”. ๋‚ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ์ƒˆ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์ด๊ฒƒ์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค: www.krpano.com/ios/bugs/ios10-webgl-video-texture-crash/
ํ˜„์žฌ three.js์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๋‹ค์ง€ ๋ฉ€๋ฆฌ ๊ฐ€์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ํŽ˜์ด์ฆˆ์›. OSX์™€ IOS์˜ ๋ฌธ์ œ๋กœ ์‚ฌํŒŒ๋ฆฌ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Mp4๋Š” IOS ๋ฐ OSX์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์•คํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ์„ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋‘˜ ์‚ฌ์ด์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์›์‹œ webgl ์˜ˆ์ œ๋Š” ์—ฌ์ „ํžˆ IOS์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ OSX์—์„œ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค.

๋“ค๋ฅผ ์ˆ˜ โ€‹โ€‹์žˆ๋Š” ์ž‘๋™ํ•˜๋Š” ์ •๋ฐฉํ˜• ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ •๋ณด: http://stackoverflow.com/questions/39123109/rendering-a-video-with-webgl-in-ios-10-beta-7-safari-shows-weird-purpish-co.

์ด๊ฒƒ์ด ๋ธŒ๋ผ์šฐ์ € ๋ฒ„๊ทธ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ WebGL ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ฐ์•ˆํ•  ๋•Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์บ”๋ฒ„์Šค๋ฅผ ํ†ตํ•ด ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌํŒŒ๋ฆฌ์—์„œ ์˜์ƒ์ด ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ iOS์—๋Š” ์—ฌ์ „ํžˆ CORS ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Same Origin์—์„œ๋งŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://bugs.webkit.org/show_bug.cgi?id=135379

webgl์€ ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.
https://github.com/NishimuraT/videojs-panorama/commit/bd99200d8831c7ad0d10d742e087953da0f44169

@NishimuraT canavasrender๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์Šจ ๋ง์ธ์ง€ ์•Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ CPU๋กœ ์ธํ•ด ์‹ฌ๊ฐํ•œ ๋“œ๋กญ ํ”„๋ ˆ์ž„ ๋ฐ ์žฌ์ƒ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ IOS์—์„œ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. Ipad 3๋Š” ์ด๋ฏธ webgl์šฉ ํ”„๋ ˆ์ž„์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

@danrossi ์ œ๊ฐ€ ์กฐ๊ธˆ ์˜คํ•ด๋ฅผ

raw webgl๊ณผ shader๋ฅผ ์‚ฌ์šฉํ•˜๋Š” elevr ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œ ์ž‘๋™ํ•˜๋ ค๋ฉด ๊ทธ ํ•˜๋‚˜๋ฅผ ํ•ดํ‚นํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  three.js์— ๋™์ผํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” elevr์—์„œ ๊ทธ๊ฒƒ์ด ๊นจ์ง€๋Š” ์›์ธ์ด ๋˜๋Š” ํ…์Šค์ฒ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์ž๋™ ์ง€์šฐ๊ธฐ์ž„์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

webGL.gl.bindTexture(webGL.gl.TEXTURE_2D, null);

์ด๊ฒƒ์ด ์ฃผ์„ ์ฒ˜๋ฆฌ๋˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ์œ„ํ•œ ๊ฒƒ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

webGL.gl.pixelStorei(webGL.gl.UNPACK_FLIP_Y_WEBGL, true);

three.js์—์„œ ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” auto clear ์†์„ฑ์ด ์žˆ์„๊นŒ์š”?

์— ๋Œ€ํ•œ ๋งŽ์€ ์–ธ๊ธ‰์„ ๋ด…๋‹ˆ๋‹ค.

state.bindTexture(_gl.TEXTURE_2D, null);

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์–ด๋””์— ์žˆ์„์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋ฏธ์ณ์„œ ํ…์Šค์ฒ˜ ๋“œ๋กœ์ž‰ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์งˆ๊ฐ ๋ฐ”์ธ๋”ฉ์— ๋ญ”๊ฐ€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@danrossi ์ œ๋Œ€๋กœ ๋ Œ๋”๋งํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋…ธ์ด์ฆˆ ๋ฉ”์ดํŠธ์—๊ฒŒ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. AB ํ…Œ์ŠคํŠธ๋ฅผ ๋” ๋งŽ์ด ํ–ˆ์Šต๋‹ˆ๋‹ค. elevr ๋ฐ๋ชจ์—๋„ ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
https://github.com/mrdoob/three.js/blob/6c7f000734f8579da37fb39e5c2e9e5e2dfb14f8/src/renderers/webgl/WebGLTextures.js#L411

์ด๊ฒƒ์ด ๋ฌธ์ œ์˜ ์›์ธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์—†์œผ๋ฉด ์งˆ๊ฐ์ด ๊ฑฐ๊พธ๋กœ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ๋˜ ๋‹ค๋ฅธ ์›์‹œ ์˜ˆ์ œ๋Š” FLIP_Y๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๊ฐ€๋Šฅํ•œ Webkit ๋ฒ„๊ทธ?

http://dev.electroteque.org/threejs/webgl3.html

flipY์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ฐธ์กฐ๋Š” ์ด๊ฒƒ์ด์ง€๋งŒ webkit nightly๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

https://bugs.webkit.org/show_bug.cgi?id=162491

ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์ด ์ค‘๋‹จ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” flipY๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

texture = new THREE.VideoTexture( video );
                texture.minFilter = THREE.LinearFilter;
                texture.format = THREE.RGBFormat;
                texture.magFilter = THREE.LinearFilter;
                texture.flipY = false;

http://dev.electroteque.org/threejs/hlsflipy.html

์ง€๊ธˆ ์›นํ‚ท ๋ฒ„๊ทธ์ธ์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ…์Šค์ฒ˜๋ฅผ ํšŒ์ „ํ•˜์—ฌ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

์ง€๊ธˆ์€ ํ…์Šค์ฒ˜๋ฅผ ํšŒ์ „ํ•˜์—ฌ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ uv๋ฅผ ๋’ค์ง‘๊ฑฐ๋‚˜ ์…ฐ์ด๋”์—์„œ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@makc ์–ด๋–ป๊ฒŒ

๋” ๋‚˜์•„๊ฐ€ ํ—ค๋“œ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์ด FlipY "์ˆ˜์ •"์€ IOS 9์—์„œ ๋„์›€์ด ๋˜์ง€ ์•Š๊ณ  ๋ฐฉ๊ธˆ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ๋ฉฐ์น ์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ฒ‰๋ณด๊ธฐ์—๋Š” Three.JS๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์›นํ‚ท์˜ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‰์†Œ์™€ ๊ฐ™์ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ €๋„ ๊ฑฐ๊ธฐ์— ์‹ ๊ณ ํ–ˆ์–ด์š” https://bugs.webkit.org/show_bug.cgi?id=163866

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.

http://jsfiddle.net/hfj7gm6t/2182/

@makc ๊ฐ€ uv๋ฅผ ๋’ค์ง‘๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ˜์ „ํ•ฉ๋‹ˆ๊นŒ?

uv.setY (i, 1 - uv.getY (i));

http://dev.electroteque.org/threejs/hls.html

IOS์—์„œ๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

@makc. ์ด ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐ˜์ „์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ๋ชจ ์†Œ์Šค ์ค‘ ํ•˜๋‚˜์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

attribute vec2 vx;varying vec2 tx;void main(){gl_Position=vec4(vx.x*2.0-1.0,1.0-vx.y*2.0,0,1);tx=vx;}

FlipY ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๋˜ ์›๋ž˜ ๋ฐ๋ชจ์—์„œ ๋ฐœ๊ฒฌ๋˜์—ˆ์œผ๋ฉฐ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

http://dev.electroteque.org/threejs/webglnoflip.html

์ด๊ฒƒ์„ three.js์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด์‹ญ๋‹ˆ๊นŒ? ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ง€๊ธˆ๋„ IOS๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์žˆ๋‹ค.

ํฅ๋ฏธ๋กญ๋„ค์š”. ์ด ๊ณ„์‚ฐ์„ ์ด ์˜ˆ์ œ์— ๋ณต์ œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋’ค์ง‘๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์‹ฌํ•˜๊ฒŒ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

http://dev.electroteque.org/threejs/webglflipped.html

๋”ฐ๋ผ์„œ gl_Position์€ ์œ„์น˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

 gl_Position = vec4(aVertexPosition.x*2.0-1.0,1.0-aVertexPosition.y*2.0,0,1);

์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?

์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์€ ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ ์‹คํ–‰๋˜์ง€๋งŒ ์ „์ฒด๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ง์ „์— ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์—์„œ UV๋ฅผ ๋’ค์ง‘์Šต๋‹ˆ๋‹ค.

@makc๋Š” ์•„๋งˆ๋„ ์ฒ˜์Œ์— ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งž๋‹ค๋ฉด ์ด uv ๊ฐ’์€ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณ€์ˆ˜์ด๋ฉฐ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ?

์†Œ์Šค์—์„œ gl_Position์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฐธ์กฐ๋ฅผ ๋ด…๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋งž๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ์ด๋Ÿฐ๊ฒƒ๋„ ์žˆ๋‹ค

gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

๊ฐ์‚ฌ ํ•ด์š”.

IOS Safari์—์„œ webgl์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํŠธ๋ฆญ์„ ์‹œ๋„ํ•˜์—ฌ ๋ Œ๋”๋งํ•  ํ”„๋ ˆ์ž„์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ์œผ๋ฉฐ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฒ€์€์ƒ‰์ž…๋‹ˆ๋‹ค. MP4๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฐœ๊ฒฌ ์‚ฌ๋žŒ๋“ค๋„ ์ฐพ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ btw ์šฉ์ด์ง€๋งŒ VOD๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋ช‡ ๊ฐ€์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ FLIPY ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ์ด ์›์‹œ webgl ์˜ˆ์ œ๊ฐ€ IOS 10์—์„œ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ three.js ๋ฒ„์ „์€ ์‹ค์ œ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ…์Šค์ฒ˜๋ฅผ ๋ญ‰ํˆญํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” NEAREST ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ๊ณ , ๊ทธ๊ฒƒ์„ ๋ณต์ œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ทธ๋“ค์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

http://dev.electroteque.org/threejs/hls.html
http://dev.electroteque.org/threejs/hls2.html

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•œ IOS 9๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ

http://dev.electroteque.org/threejs/webglworking.html

๋งค์šฐ ๋ฌด๊ฒ๊ณ  ๊ณ ํ†ต์Šค๋Ÿฌ์šด ํ…Œ์ŠคํŠธ ํ›„์— ๋ฐ๋ชจ์™€ ๋ฌธ์ œ๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ OSX 10.11 ๋ฐ macOS, IOS 9 ๋ฐ 10 ๋ชจ๋‘์—์„œ HLS์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์›์‹œ webgl ์˜ˆ์ œ๋Š” ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— FlipY๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. three.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ๋’ค์ง‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

IOS 10์˜ HLS ๋ Œ๋”๋ง์ด ํ‘œ์‹œ๋˜์ง€๋งŒ ์‹ฌ๊ฐํ•œ ์ƒ‰์ƒ ์•„ํ‹ฐํŒฉํŠธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์ด ์ž‘๋™์„ ๋ฉˆ์ท„์ง€๋งŒ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ํ”„๋ ˆ์ž„์ด ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ IOS 10์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. IOS 9์—๋Š” ์ „ํ˜€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค mp4 ๋ฐ HLS์šฉ CORS ํ”„๋ก์‹œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์•„๋‹˜์„ ํ™•์ธํ•œ ํ›„ IOS 10์—์„œ HLS์˜ ์—ฐ์ƒ‰์„ฑ ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ด์ œ ๋‹ค๋ฅธ ํ‹ฐ์ผ“์„ ์ œ๊ณตํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋„ Safari๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒƒ์€ ๋‹น์—ฐํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ Safari๊ฐ€ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋‹ค๋ฅธ rgb ํ˜•์‹ ์„ค์ •์„ ์ œ๊ณตํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์ˆ˜์ง coiourbars๋ฅผ ์ƒ์„ฑํ•˜๊ณ  rgba๋Š” ์ƒ‰์ƒ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ. ๋‚ด Ipad ์žฅ์น˜๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ IOS 10์„ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ™•์ธ์„ ์œ„ํ•ด IOS 10์ด ์„ค์น˜๋œ Iphone์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/threejs-hls.html
http://dev.electroteque.org/webgl/threejsrgba-hls.html

http://dev.electroteque.org/webgl/webgl.html
http://dev.electroteque.org/webgl/webglrgba.html

์ด ๋‘ ๊ฐ€์ง€ ์˜ˆ์— ์ง‘์ค‘ํ•˜์‹ญ์‹œ์˜ค. RGB ํ”Œ๋ž˜๊ทธ๋Š” ์‹ค์ œ ์žฅ์น˜์—์„œ ์ฐจ์ด๊ฐ€ ์—†์œผ๋ฉฐ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์ž˜๋ชป๋œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ RGBA ํ˜•์‹์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์‚ฌํ•œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ HLS๊ฐ€ ์žˆ๋Š” IOS 9/10/OSX Safari์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Webkit flakey ๋ฒ„๊ทธ๊ฐ€ three.js ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ด์ œ ๋‘ ๋ฒˆ์งธ ํ‹ฐ์ผ“์ด ํ•„์š”ํ•œ HLS webGL ๋ Œ๋”๋ง์œผ๋กœ ์ƒ‰์ƒ ๋ฌธ์ œ๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๋งŽ์€ ์—„์ฒญ๋‚œ ๊ฒฐํ•จ๊ณผ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ์‡ผ ์Šคํ† ํผ๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ HLS webgl ์ถœ๋ ฅ์€ IOS 9๊ฐ€ ์•„๋‹Œ IOS 10์—์„œ ๋ถ€๋ถ„์ ์œผ๋กœ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์žฅ์น˜๊ฐ€ ํ˜„์žฌ 9์—์„œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. 9์‹œ์— ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/threejs-hls.html
http://dev.electroteque.org/webgl/webgl.html

์•ˆ๋…•ํ•˜์„ธ์š”! ๋‚˜๋„ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์•ˆ๊ณ ์žˆ์–ด. ์ง€๊ธˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๊ทธ ๋ฐ๋ชจ์— ์žˆ์ง€๋งŒ IOS 10์˜ ์ƒ‰์ƒ ๊ณต๊ฐ„ ๋ฌธ์ œ์— ๊ด€ํ•œ ๋‘ ๋ฒˆ์งธ ํ‹ฐ์ผ“์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. Webkit/Apple์„ ๋Œ€์‹ ํ•˜์—ฌ IOS 9์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋…ธ๋ ฅ์€ ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, Ipad 3๊ณผ ๊ฐ™์€ ๊ตฌํ˜• ์žฅ์น˜๋Š” ์ œ์™ธ๋˜์ง€๋งŒ ์–ด์จŒ๋“  ๊ฐ„์‹ ํžˆ 5fps๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IOS 10์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๋จผ์ € ์ง‘์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Webkit์— ๋ณด๊ณ ๋œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  Safari์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/webgl.html ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ios10์—์„œ ํŽ˜์ด์ง€๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์‚ฌํŒŒ๋ฆฌ๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

threejs ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ด ๋ฌธ์ œ์— ๋‚˜์—ด๋œ ๋ชจ๋“  ์˜ˆ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. http://dev.electroteque.org/webgl/webglrgba.html ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ‰ ๊ณต๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@wuyingfengsui ์ด๊ฒƒ์€ IOS 10 Iphone์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/threejs-hls.html

๋‹น์‹ ์€ ์•„๋งˆ ๋‚ด๊ฐ€ ๋‚ด๊ธฐ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์—„์ฒญ๋‚œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋…น์ƒ‰ ์ปฌ๋Ÿฌ๋ฐ”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. RGBA ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ์ด์ƒํ•œ ๊ทธ๋ž˜ํ”ฝ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ RGBA ํ”Œ๋ž˜๊ทธ์™€ ๊ฐ™์ด RGB ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‹ค์ œ IDevice์—์„œ ์ƒ‰ ๊ณต๊ฐ„ ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

Ipad 3๊ฐ€ ๊ตฌ์‹์ด ๋˜์—ˆ์ง€๋งŒ ๊ณ ๋ง™๊ฒŒ๋„ Iphone์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ IOS 10์„ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

CORS ํ”„๋ก์‹œ URL๋„ ๊ธฐ๋กํ•ด ๋‘์‹ญ์‹œ์˜ค.

์ƒ‰์ƒ ๊ณต๊ฐ„ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์ง€๊ธˆ ์ด๊ฒƒ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

์ด ์›นํ‚ท ํ‹ฐ์ผ“์€ ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค๋ฅผ ๋ฏธ๋ฃจ๋Š” ๋ฐ ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://bugs.webkit.org/show_bug.cgi?id=164540

ios 10 iphone 7์—์„œ RGB๋ฅผ RGBA๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ๋‹ค๋ฅธ ์žฅ์น˜์— ๋Œ€ํ•ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. RGBA๋กœ ์—…๋ฐ์ดํŠธ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋•Œ ?

http://dev.electroteque.org/webgl/threejs-hls.html

@danrossi ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@wuyingfengsui ๊ทธ๊ฒƒ์— ๊ด€ํ•ด ์›นํ‚ท ํ‹ฐ์ผ“์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—‰๋ง์ด ๋  ๋‹ค๋ฅธ ์ƒ‰์ƒ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ HLS ์ŠคํŠธ๋ฆผ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋™์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

three.js ์ƒ์ˆ˜์— ๋‹ค์–‘ํ•œ ๊ฐ’์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์ด๊ฒƒ๋“ค. ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐ”์ดํŠธ ์œ ํ˜• ํ”Œ๋ž˜๊ทธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œํ–‰ ์ฐฉ์˜ค์™€ ๋งค์šฐ ํ”ผ๊ณคํ•œ ์‹œํ–‰ ์ฐฉ์˜ค.

https://github.com/mrdoob/three.js/blob/dev/src/constants.js#L126

๊ทธ๋ž˜์„œ ์Šฌํ”„๊ฒŒ๋„ IOS 9๋Š” ์ด๊ฒƒ์œผ๋กœ ์™„์ „ํžˆ ์ค‘๋ณต๋˜์–ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ ์žฅ์น˜๋Š” IOS 10์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฐฉํ•ด ํ–‰์œ„๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ Safari 10์ด ์ถœ์‹œ๋˜๊ธฐ ์ „์— ์ž‘๋™ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? Apple ๋ฐ ๋•Œ๋กœ๋Š” Android์™€์˜ ๋ชจ๋“  ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์— ๋ช‡ ๋‹ฌ์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” HLS๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์„ ๋•Œ ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” webGL์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›นํ‚ท์ด ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด webgl์— ํ…์Šค์ฒ˜๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);

@wuyingfengsui macOS์—์„œ CORS ๋ฌธ์ œ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ "์ˆ˜์ •"ํ•˜๋Š” ๋ฐ 5๋…„ ์ด์ƒ์ด ๊ฑธ๋ ธ๋‹ค๋ฉด

๊ทธ๋ž˜์„œ ๋ˆ„๊ตฐ๊ฐ€๋Š” ๊ฑฐ๊ธฐ์— ์•‰์•„์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด์•ผ ํ•˜๊ณ  ์Šฌํ”„๊ฒŒ๋„ ์ € ์ž์‹ ์ž…๋‹ˆ๋‹ค.

์›์‹œ webgl ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—‰๋ง์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ three.js๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๊ณ  "ํ˜•์‹" ๋ฐ "์œ ํ˜•" ์†์„ฑ์€ ๋ฐ”์ดํŠธ ํ˜•์‹์ด๊ณ  ํ˜•์‹์€ RGBA๊ฐ€ ๊ฑฐ์˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ƒ‰์ƒ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

๋‚ด์ผ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์—ฌ ๊ฐ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ•˜๋‚˜์˜ ์กฐํ•ฉ์ด ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@danrossi ์–ด๋–ป๊ฒŒ

๋‚˜๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ”Œ๋ž˜๊ทธ์™€ ์•„๋ฌด ๊ฒƒ๋„ ์—‰๋ง์œผ๋กœ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. RGB ๋ฐ RGBA ํ”Œ๋ž˜๊ทธ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐ”์ดํŠธ ์œ ํ˜•์€ ๋ถ€ํ˜ธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ต์…˜์€ ๊ฒ€์€์ƒ‰ ์บ”๋ฒ„์Šค๋งŒ โ€‹โ€‹ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ๋” ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด์‹ญ๋‹ˆ๊นŒ?

@danrossi ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. Hls.js ๊ฐ€ MSE๋กœ hls ๋น„๋””์˜ค๋ฅผ ์žฌ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์„

@wuyingfengsui ์ด๊ฒƒ์€ ์ด์ œ IOS์˜ ๊ธฐ๋ณธ HLS ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์ˆ˜์ • ์‚ฌํ•ญ์€ Safari OSX์˜ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Dash ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „ Safari์—๋Š” ํ”„๋ก์‹œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒฝ์šฐ์—๋„ CORS ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด macOS์—์„œ ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ๋„ ๊ณ ์ณค์Šต๋‹ˆ๊นŒ?

์œ„์˜ ์ฝ”๋“œ ์ˆ˜์ •์„ ์‚ฌ์šฉํ•˜์—ฌ three.js์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์›นํ‚ท์„ ์˜์‹ฌํ•˜๊ณ  ์• ํ”Œ์ด ๊ทธ๊ฒƒ์„ ๊ณ ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์ด ํ‹ฐ์ผ“์— ๋ชจ๋“  ์‹œ์„ ์ด ์ง‘์ค‘๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. RGB ํ”Œ๋ž˜๊ทธ ํ•ญ๋ชฉ์€ ์ด์ œ IOS 10 ๋ Œ๋”๋ง๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๊ฐ‡ํžŒ IOS 9 ๋ฐ ์ด์ „ ์žฅ์น˜๋Š” ์ฑ„์›Œ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? iOS์—์„œ ๊ณ ์ • ์ƒ‰์ƒ ๋ Œ๋”๋ง์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํ‹ฐ์ผ“์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

HLS ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์™ธ๋ถ€๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋Š” three.js์— ๋“ค์–ด๊ฐˆ์ง€ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

texture = new THREE.VideoTexture( video );
texture.minFilter = THREE.LinearFilter;
texture.format = THREE.RGBAFormat;
texture.magFilter = THREE.LinearFilter;
texture.generateMipmaps = false;
texture.flipY = false;

var geometry = new THREE.SphereBufferGeometry( 500, 64, 44 );
geometry.scale( - 1, 1, 1 );

var uv = geometry.getAttribute('uv');
for (var i = 0; i < uv.count; i++) {
     uv.setY (i, 1 - uv.getY (i));
}

webgl ํ”Œ๋ž˜๊ทธ๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด raw webgl ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์˜ต์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์•„๋ฌด ๊ฒƒ๋„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ›Œ๋ฅญํ•˜๊ณ  ์ง„์ •์œผ๋กœ ๋ฐฉํ•ด๋ฅผ ๋ฐ›์•˜์œผ๋ฉฐ ์›นํ‚ท์—์„œ ์‘๋‹ต์ด ์—†์Šต๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/webgl.html

๊ฐ์‚ฌ ํ•ด์š”. HLS ์™ธ์— iOS ๋น„๋””์˜ค ํ”Œ๋ž˜๊ทธ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ๋‹ค๋ฅธ ๋น„๋””์˜ค ํ˜•์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ Œ๋”๋ง ๋ฌธ์ œ ์—†์ด H.264๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@pedrofranceschi mp4 ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. IOS์—์„œ ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ 360 ๋น„๋””์˜ค๋ฅผ ์œ„ํ•œ ์˜ต์…˜์„ ์ฑ„์šฐ๋Š” ๊ฒƒ์€ HLS์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์ด ํ‹ฐ์ผ“๊ณผ ๊ด€๋ จ๋œ ํ”Œ๋ฆฝ ์ˆ˜์ •์€ HLS ์ŠคํŠธ๋ฆผ๊ณผ Safari์—๋งŒ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด FlipY ์ˆ˜์ •์€ IOS 10์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋Š” ๊ตฌํ˜• ์žฅ์น˜๋ฅผ ์ข…๋ฃŒํ•˜๋Š” IOS 9์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•œ Ipad 3์—์„œ๋Š” HLS ๋ฐ WebGl์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ์•„์ดํฐ์—์„œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. IOS 10 ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ๊ฑฐ์˜ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹ค๋ฅธ ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•œ ์ƒ‰์ƒ ์ธ๊ณต๋ฌผ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ ์–ด๋„ IOS 10์—์„œ Iphone์— ๋Œ€ํ•œ ์ธ๋ผ์ธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ž‘๋™ํ–ˆ์œผ๋ฉฐ ์ธ๋ผ์ธ ๋น„๋””์˜ค ๋ฐ webgl์ด ์ด์ œ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ CORS๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. CORS๋Š” macOS์˜ Safari์—์„œ๋งŒ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋˜ ๋‹ค๋ฅธ ๊ณ ์ „์ ์ธ ์›นํ‚ท ๋ฒ„๊ทธ์ด๊ณ  ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์—์„œ HLS.JS ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๊ดœ์ฐฎ๊ธฐ ๋•Œ๋ฌธ์— Safari๋ฅผ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค.

์บ”๋ฒ„์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ iOS 10์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปค๋ฐ‹์„ ๋ณด์„ธ์š”: https://github.com/yanwsh/videojs-panorama/commit/0122b1bbd31093b77ca7f09900afa74e2c537037

๊ทธ๊ฒƒ์€ ๋น„ ์ด๋ฒคํŠธ์˜€์Šต๋‹ˆ๋‹ค. drawImage์™€ ํ•จ๊ป˜ ์บ”๋ฒ„์Šค ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. WebGL์ด ์•„๋‹™๋‹ˆ๋‹ค. three.js ์บ”๋ฒ„์Šค ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Canvas ๋ Œ๋”๋Ÿฌ๋Š” IOS์—์„œ ์ •๋ง ์งœ์ฆ๋‚˜์„œ ํ”„๋ ˆ์ž„์„ ๋–จ์–ด๋œจ๋ ค ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹น์‹ ์˜ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๊นŒ?

ํ’ˆ์งˆ์ด ๋ณ„๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค :)

ํ”„๋ ˆ์ž„์„ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๊ฒƒ์€ ํ’ˆ์งˆ ๋ฌธ์ œ ๊ทธ ์ด์ƒ์ž…๋‹ˆ๋‹ค. :)

@mrdoob ์บ”๋ฒ„์Šค ๋ Œ๋”๋Ÿฌ๋ฅผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‰ฌ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํšŒ์ „๋„ ์˜ณ์ง€ ์•Š๋‹ค. mp4 ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋ฉด ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฉ”์‰ฌ ์„ ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋ ˆ์ž„์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/canvas-hls.html

@danrossi

screen shot 2016-12-06 at 09 16 47

@mrdoob ์ด ๋ฌธ์ œ๋Š” Safari์˜ HLS์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๋ฐ๋ชจ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์กฐํ•ฉ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ Chrome์ด mp4 ahh์˜ Safari CORS ํ”„๋ก์‹œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์ง€๊ธˆ mp4 ์žฌ์ƒ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

IOS 10์˜ HLS ๋ฌธ์ œ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ดดํ•œ CanvasRenderer ๋ฌธ์ œ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ํ•œ. ์—ฌ๊ธฐ์— ์กฐํ•ฉ์ด ์žˆ์œผ๋ฏ€๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…๊ณผ ๊ฐ€๋Šฅํ•œ ์ด์ƒํ•œ ํšŒ์ „ ๊ฐ’ ์˜คํ”„์…‹์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜ ์œ„์— ๋ฉ”์‰ฌ ๊ทธ๋ฆฌ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌํŒŒ๋ฆฌ์šฉ

http://dev.electroteque.org/webgl/webgl-mp4.html
http://dev.electroteque.org/webgl/canvas-hls.html

ํฌ๋กฌ์šฉ

http://dev.electroteque.org/webgl/webgl-webm.html
http://dev.electroteque.org/webgl/canvas-webm.html

@danrossi Safari ๋ฒ„์ „๋„ iOS 10์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹คโ€ฆ

์ด๊ฒƒ์€ IOS 10์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ƒ‰์ƒ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/threejs-hls.html

๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ IOS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ CanvasRenderer ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ๋ฐ์Šคํฌํƒ‘ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ž‘๋™ํ•ด์•ผ ํ•˜๊ณ  ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ชจ๋“  IOS์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/webgl-mp4.html

๋‚˜๋Š” CanvasRender ์†”๋ฃจ์…˜์ด IOS๋ฅผ ์œ„ํ•œ ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์ง€๋Š” ์•Š์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ CORS ํ”„๋ก์‹œ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ”๋ฒ„์Šค ๊ทธ๋ฆฌ๊ธฐ๋Š” ํ”„๋ ˆ์ž„ ์†์‹ค๋งŒ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. Safari OSX๋Š” threejs-hls.html์—์„œ FlipY ์ž‘์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์บ”๋ฒ„์Šค ๋ฐ๋ชจ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ ์™ธ๋ถ€์—์„œ ๊ทธ๋ฆด ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ ํ˜•์ƒ์— ์ด์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ์ดํ•ดํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ทธ๋ฆผ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜๊ฑฐ๋‚˜ ํšŒ์ „ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋‘ ํ•œ ์ ์œผ๋กœ ๊ธฐ์šธ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์™ผ์ชฝ ์ƒ๋‹จ ์˜์—ญ์„ ํด๋ฆญํ•˜๊ณ  ๊ถค๋„ ์ œ์–ด๋กœ ๋“œ๋ž˜๊ทธํ•˜์‹ญ์‹œ์˜ค.

๋ฉ”์‰ฌ ๋ฌธ์ œ๋Š” ๋ฉ”์‰ฌ ํ‘œ์‹œ๋ฅผ ์ค‘์ง€ํ•˜๋ ค๋ฉด MeshBasicMaterial์— "overdraw: 0.5"๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

CanvasRenderer๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌํŒŒ๋ฆฌ์— CORS ํ”„๋ก์‹œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CanvasRenderer๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ํ”„๋ ˆ์ž„์„ ๋–จ์–ด๋œจ๋ฆด ๋•Œ ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์œผ๋กœ SoftwareRenderer๋ฅผ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/canvas-mp4.html
http://dev.electroteque.org/webgl/canvas-hls.html

CanvasRenderer๋Š” ๋ช…๋ฐฑํ•œ ํ”„๋ ˆ์ž„ ์‚ญ์ œ๋กœ ์ธํ•ด ๊ฐ๊ฐ€์ƒ๊ฐ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ตœํ›„์˜ ์ˆ˜๋‹จ์€ SoftwareRenderer๋กœ ๋น„๋””์˜ค ํ…์Šค์ฒ˜๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์•„์ง ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ์˜ˆ์ œ ์„ค์ •์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊ฒ€์€ ์บ”๋ฒ„์Šค์ž…๋‹ˆ๋‹ค.

์ƒ‰์ƒ ๊ฒฐํ•จ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ๊ฒƒ์ด ํŒŒ๋ž—๋‹ค

@andreabadesso ํ‹ฐ์ผ“ ์„ค์ •์ด ๋‘ ๊ฐœ ์žˆ๋Š”๋ฐ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

OSX์˜ ๊ฒฝ์šฐ FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ ๋ถˆ์พŒํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IOS 10์˜ ๊ฒฝ์šฐ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์บ”๋ฒ„์Šค ๋“œ๋กœ์ž‰์€ ํฐ ์‹คํŒจ์ž…๋‹ˆ๋‹ค. ์ƒ์ž์—์„œ ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง๋˜์ง€๋„ ์•Š๊ณ  ๋ณด์„์ด ์™œ๊ณก๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„๋„ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์ œ ์—ฌ์ „ํžˆ ์บ”๋ฒ„์Šค ๋“œ๋กœ์ž‰์— ์˜์กดํ•˜๋Š” "SoftwareRenderer"๋กœ ์šด์„ ์‹œํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‚ด๊ฐ€ ์–ป๋Š” ๊ฒƒ์€ ๊ฒ€์€ ์บ”๋ฒ„์Šค๋ฟ์ด๋ฏ€๋กœ ์•„๋ฌด ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋น„๋””์˜ค ํ…์Šค์ฒ˜๋ฅผ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ต์…˜์ด ์—†์œผ๋ฉฐ webkit์ด ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  webgl ํ”Œ๋ž˜๊ทธ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ์•„๊ฐ€์„œ ์ธ์ฝ”๋”ฉ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ HLS๋Š” ์ž‘์—… mp4 ํŒŒ์ผ์—์„œ ํŒจํ‚ค์ง€๋ฉ๋‹ˆ๋‹ค.

ํ•œํŽธ, ํ•„์‚ฌ์ ์ธ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด .ts ํŒŒ์ผ์„ ๊ฐ์‹œํ•˜๊ณ  .mp4๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์›น ์†Œ์ผ“์„ ๋ฐฉ์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ mp4(ios10์—์„œ ์ž‘๋™ํ•˜๋Š”)์˜ ๋‹ค์Œ ์กฐ๊ฐ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Lab21k/node-hls-mp4-ws/

๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ „์ฒด ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@andreabadesso ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋งค์šฐ ์กฐ์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. CORS ํ”„๋ก์‹œ๊ฐ€ ํ•„์š”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹ค์‹œ๊ฐ„์œผ๋กœ FFMPEG๋ฅผ ํ†ต๊ณผํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. O IOS๋Š” ์›น ์†Œ์ผ“๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด webrtc๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

SoftwareRenderer ์˜ต์…˜์„ ํ†ตํ•ด ์—ฌ์ „ํžˆ ์บ”๋ฒ„์Šค ๋“œ๋กœ์ž‰์„ ํ†ตํ•ด ๋น„๋””์˜ค ํ…์Šค์ฒ˜๋ฅผ ์–ป์œผ๋ ค๋Š” ์‹œ๋„๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๋ธ”๋ž™ ํ”„๋ ˆ์ž„์ž…๋‹ˆ๋‹ค. ๋‘ ์˜ต์…˜ ๋ชจ๋‘ ๋ง‰๋‹ค๋ฅธ ๊ณจ๋ชฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ SoftwareRenderer๊ฐ€ ๋น„๋””์˜ค ํ…์Šค์ฒ˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ์ง€ ํ…์Šค์ฒ˜๋งŒ ํ‘œ์‹œ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” ์ง€๋‚œ ๋‚  ์ƒ‰์ƒ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž‘์—…ํ•ด ์™”์œผ๋ฉฐ ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋Š” ๋งค์šฐ ์œ ์šฉํ–ˆ์œผ๋ฉฐ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š” ๋นจ๊ฐ„์ƒ‰๊ณผ ํŒŒ๋ž€์ƒ‰ ์ƒ‰์ƒ์ด ์„œ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ffmpeg๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ƒ‰์ƒ์„ ๋ฏธ๋ฆฌ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. threejs์—์„œ ์ƒ‰์ƒ์ด ๋‹ค์‹œ ์ „ํ™˜๋˜๋ฉด ๋น„๋””์˜ค๊ฐ€ ์›๋ž˜ ๋ชจ์–‘์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
์ตœ์ ์˜ ์†”๋ฃจ์…˜์€ ์•„๋‹ˆ์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (IOS 10.2์—์„œ ํ…Œ์ŠคํŠธ)

@Yralec

์ธ์ฝ”๋”ฉ ๋ฌธ์ œ์ด๊ฑฐ๋‚˜ ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Wowza ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์— ๋Œ€ํ•ด์„œ๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ ์ธ์ฝ”๋”์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ VOD์šฉ.

ํ™•์ธ์„ ์œ„ํ•œ ffmpeg ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ•„์š”ํ•œ FlipY ๋ฌธ์ œ๋ฅผ ์ œ์™ธํ•˜๊ณ  three.js์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Webkit์ด ์™œ ์ด๋Ÿฐ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@danrossi

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ffmpeg -i in.mp4 -hls_time 10 -hls_list_size 0 -vf "colorchannelmixer=rr=0.0:rb=1.0:bb=0.0:br=1.0,vflip" -pix_fmt yuv420p out.m3u8
๋ณด์‹œ๋‹ค์‹œํ”ผ ์ถœ๋ ฅ์„ ๋’ค์ง‘๊ณ  ์žˆ์œผ๋ฏ€๋กœ threejs์—์„œ ์ง์ ‘ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด๋ ค๊ณ  ํ–ˆ์–ด.

ํŒŒ๋ž€์ƒ‰๊ณผ ๋…น์ƒ‰์„ ๋ฐ”๊พธ๋Š” ์…ฐ์ด๋”๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์ง€ ์•Š์„๊นŒ์š”?

@mrdoob ์ €๋Š” ์…ฐ์ด๋”์— ๋Œ€ํ•œ ์ง€์‹์ด ๊ฑฐ์˜ ์—†์œผ๋ฏ€๋กœ ์ €์—๊ฒŒ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(๋˜ํ•œ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐ์กฐ์ฐจ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋นจ๊ฐ„์ƒ‰๊ณผ ํŒŒ๋ž€์ƒ‰์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ฑฐ์˜ ํ™•์‹คํ•˜๊ฒŒ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๋งˆ์นจ๋‚ด ์ž‘๋™ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@mrdoob ๋ญ”๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ Webkit ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. FlipY ์ˆ˜์ •์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ”ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์กฐ์‚ฌ๋ฅผํ–ˆ๊ณ  ์ด์™€ ๊ฐ™์€ ์ฑ„๋„ ์ˆœ์„œ ๊ตํ™˜์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด์ œ ์…ฐ์ด๋” ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

gl_FragColor = texture2D(u_image, v_texCoord).bgra;

๋‚ด ์›์‹œ webgl ์˜ˆ์ œ ์—์„œ

์ด๊ฒƒ์—์„œ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์•„์ง ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

 gl.shaderSource(ps, "precision mediump float;uniform sampler2D sm;varying vec2 tx;void main(){gl_FragColor=texture2D(sm,txt).bgra;}");

๋‹จ์ˆœํžˆ ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง๋˜๋Š” ๋‚ด์šฉ์ด IOS 10์—์„œ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์…ฐ์ด๋”์—์„œ ๊ต์ฒด๋œ ๋นจ๊ฐ„์ƒ‰๊ณผ ํ๋ฆผ ์ƒ‰์ƒ์„ ๋ฐ˜์ „์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

http://dev.electroteque.org/webgl/webglbgra.html

@Yralec์€ IOS10 ์—์„œ ์…ฐ์ด๋”์˜ ์ƒ‰์ƒ ์ฑ„๋„ ์ˆœ์„œ ๋ฐ˜์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ด์ƒํ•œ ์„  ์—†์ด ๋ Œ๋”๋งํ•˜๋ ค๋ฉด ์ƒ‰์ƒ ํ˜•์‹์„ rgba๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, ๋น„๋””์˜ค);

@mrdoob ๋‚ด์žฅ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์— ์ด ํ…์Šค์ฒ˜ ์ƒ‰์ƒ ๋ณ€๊ฒฝ์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

gl_FragColor=texture2D(sm,txt).bgra;

@mrdoob. ๋ณด์ •. ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gl_FragColor = texture2D( tEquirect, sampleUV )
var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";

๊ทธ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@danrossi JS์—์„œ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

THREE.ShaderLib[ 'equirect' ].fragmentShader = THREE.ShaderLib[ 'equirect' ].fragmentShader.replace( "texture2D( tEquirect, sampleUV );", "texture2D( tEquirect, sampleUV ).bgra;" );

์…ฐ์ด๋”๋ฅผ THREE.ShaderMaterial์— ๋ณต์‚ฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ…์Šค์ฒ˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด์‹ญ๋‹ˆ๊นŒ?

var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";

                var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";


                var uniforms =  {
                    tEquirect: { value: null },
                    tFlip: { value: - 1 }
                };

                var material = new THREE.ShaderMaterial( {
                    uniforms: uniforms,
                    vertexShader: equirect_vert,
                    fragmentShader: equirect_frag
                });

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ IOS์˜ HLS ์ŠคํŠธ๋ฆผ์—๋งŒ ์ ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์œ ์—ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ์‚ฌํŒŒ๋ฆฌ์—์„œ ๋ Œ๋”๋ง๋˜์ง€๋งŒ FlipY ์ˆ˜์ •์€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊พธ๋กœ ์žฌ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์Œ์ด ํ”๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๋…ธ๋ ฅ์€ ์• ํ”Œ๊ณผ ์›นํ‚ท ๋•๋ถ„์ž…๋‹ˆ๋‹ค.

var uniforms =  {
                    tEquirect: { value: texture },
                    tFlip: { value: - 1 }
                };

                var material = new THREE.ShaderMaterial( {
                    uniforms: uniforms,
                    vertexShader: equirect_vert,
                    fragmentShader: equirect_frag
                });

@WestLangley ํŒจ์น˜๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ์ด ๊ฑฐ๊พธ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

gl_FragColor=texture2D(sm,txt).bgra;

์ด๊ฒƒ์€ [b]lue์™€ [r]ed๋ฅผ ๊ตํ™˜ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์…ฐ์ด๋”์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ˆœ์„œ๋Š” rgba์ด๋ฏ€๋กœ bgra๋Š” ์ด๋ฅผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.

FlipY ์ˆ˜์ • ์ค‘๋‹จ

์˜ˆ๋ฅผ ๋“ค์–ด txt -> vec2(txt.x, 1.0 - txt.y)

๋ฐฉ๋ฒ•์„ ๋ชฐ๋ผ

http://jsfiddle.net/p2duvg51/14/

ํŒจ์น˜๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ์ด ๊ฑฐ๊พธ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด์ฉŒ๋ฉด ๋‹น์‹ ์€ ํŒจ์น˜๋ฅผ ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ์ ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

@makc ๋‚ด ์›์‹œ

๋‚ด threejs ์˜ˆ์ œ์— ๊ฒŒ์‹œ๋œ UV ์ฝ”๋“œ์—์„œ ๋’ค์ง‘๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์…ฐ์ด๋”์—์„œ ํ”„๋ ˆ์ž„๋ณ„๋กœ ๋’ค์ง‘ํžˆ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ์ œ๊ฑฐ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์›์‹œ webgl ์˜ˆ์ œ์—์„œ๋Š” ์ •์  ์…ฐ์ด๋”์—์„œ ๋’ค์ง‘ํ˜”์Šต๋‹ˆ๋‹ค.

attribute vec2 vx;varying vec2 tx;void main(){gl_Position=vec4(vx.x*2.0-1.0,1.0-vx.y*2.0,0,1);tx=vx;}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์กฐ๊ฐ ์…ฐ์ด๋”์—์„œ ์ƒ‰์ƒ ์ฑ„๋„์„ ๋ฐ˜์ „์‹œํ‚ต๋‹ˆ๋‹ค.

precision mediump float;uniform sampler2D sm;varying vec2 tx;void main(){gl_FragColor=texture2D(sm,tx).bgra;}

three.js์—์„œ ๊ทธ๊ฒƒ์„ ๋ณต์ œํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์ง€๊ธˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ FlipY ์ˆ˜์ •์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. bgra๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV ).bgra;\n}\n";

                var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";




                var uniforms =  {
                    tEquirect: { value: texture },
                    tFlip: { value: 1 }
                };

                var material = new THREE.ShaderMaterial( {
                    uniforms: uniforms,
                    vertexShader: equirect_vert,
                    fragmentShader: equirect_frag
                });

๊ธฐ๋ณธ tFlip ๊ฐ’์„ 1๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ํ‘œ์‹œ๋˜๋ฏ€๋กœ HLS์˜ FlipY ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ˆ˜์ • ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

tFlip: { value: 1 }

๋น„๋””์˜ค๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋ Œ๋”๋ง์„ ์ค‘์ง€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์ง€๋งŒ ์ ์–ด๋„ ์ƒ‰์ƒ ๋ณ€ํ™”๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. ํŒจ์น˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋ฉด ์…ฐ์ด๋” ์ฝ”๋“œ๋ฅผ ํ™•์‹คํžˆ ๋Œ€์ฒดํ•˜์ง€๋งŒ ํŒจ์น˜๋Š” ์Šฌํ”„๊ฒŒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์–‘์ˆ˜ 1๋งŒ ์ฃผ๋Š” ๊ฐ’์œผ๋กœ ๋’ค์ง‘์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด Ipad 3๊ณผ ๊ฐ™์€ ๊ตฌํ˜• ์žฅ์น˜๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋œ ํ›„ IOS10์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. 10.10์—์„œ๋งŒ ์‹คํ–‰๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ ๋“œ๋ผ์ด๋ธŒ์—์„œ ๋ถ€ํŒ…๋œ macOS์—์„œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๋ฐฉํ•ด ํ–‰์œ„์™€ ํ•จ๊ป˜ ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค.

ํ”„๋ ˆ์ž„์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ œ๋Œ€๋กœ ํšŒ์ „ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์•„์ง ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๊ฐ€ IOS 10์—์„œ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์ž…๋‹ˆ๋‹ค. Safari์—์„œ๋Š” ๋ฐ˜์ „๋œ ์ƒ‰์ƒ์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/threejs-hls.html

์…ฐ์ด๋” ๋จธํ‹ฐ๋ฆฌ์–ผ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€ ์Šค์ผ€์ผ๋ง, ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ๋ง์น˜๊ณ  ์นด๋ฉ”๋ผ ํšŒ์ „์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

camera.position.x = (Math.PI / 2);

์ด ํŒจ์น˜๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์นด๋ฉ”๋ผ ์œ„์น˜๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ์ง€๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋ฉด ๋” ๋งŽ์€ ๋ฒ„๊ทธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. MeshBasicMaterial์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

THREE.ShaderLib[ 'equirect' ].fragmentShader = THREE.ShaderLib[ 'equirect' ].fragmentShader.replace( "texture2D( tEquirect, sampleUV );", "texture2D( tEquirect, sampleUV ).bgra;" );
                THREE.ShaderLib[ 'equirect'].uniforms.tEquirect = { value: texture };
                THREE.ShaderLib[ 'equirect'].uniforms.tFlip = { value: 1 };

                var material2 = new THREE.ShaderMaterial( {
                    uniforms: THREE.ShaderLib[ 'equirect'].uniforms,
                    vertexShader: THREE.ShaderLib[ 'equirect'].vertexShader,
                    fragmentShader: THREE.ShaderLib[ 'equirect' ].fragmentShader
                });

๊ธฐ๋ณธ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰

THREE.ShaderLib[ 'equirect' ].fragmentShader = THREE.ShaderLib[ 'equirect' ].fragmentShader.replace( "texture2D( tEquirect, sampleUV );", "texture2D( tEquirect, sampleUV ).bgra;" );
                var material  = new THREE.MeshBasicMaterial( { map : texture } );

๋‚ด์žฅ ์…ฐ์ด๋”๋ฅผ ํ•ดํ‚นํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์šฉ์ž ์ง€์ • ์…ฐ์ด๋”๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž! ๐Ÿ˜€

const WIDTH = window.innerWidth;
const HEIGHT = window.innerHeight;

var camera = new THREE.PerspectiveCamera( 75, WIDTH / HEIGHT );

var scene = new THREE.Scene();

// geometry

var geometry = new THREE.SphereGeometry( 1, 32, 16 );

// material

var loader = new THREE.TextureLoader();
var texture = loader.load( 'https://threejs.org/examples/textures/2294472375_24a3b8ef46_o.jpg');

// material

var material = new THREE.ShaderMaterial( {
    uniforms: {
        texture: new THREE.Uniform( texture )
    },
    vertexShader: [
        "varying vec2 vUV;",
        "void main() {",
        "   vUV = vec2( 1.0 - uv.x, uv.y );", // fipY: 1.0 - uv.y
        "   gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
        "}"
    ].join( "\n" ),
    fragmentShader: [
        "uniform sampler2D texture;",
        "varying vec2 vUV;",
        "void main() {",
        "   gl_FragColor = texture2D( texture, vUV ).bgra;",
        "}"
    ].join( "\n" ),
    side: THREE.BackSide
} );

var mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );

var renderer = new THREE.WebGLRenderer();
renderer.setSize( WIDTH, HEIGHT );
document.body.appendChild( renderer.domElement );

function animate( time ) {
    requestAnimationFrame( animate );
    mesh.rotation.y = time * 0.0001;
    renderer.render( scene, camera );
}

animate();

https://jsfiddle.net/9jy92zxn/

๊ฒ€์€ ํ™”๋ฉด๋งŒ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@danrossi ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•ฉ๋‹ˆ๋‹ค.

var material = new THREE.ShaderMaterial({
      uniforms: {
        texture: { value: texture }
      },
      vertexShader: [
        "varying vec2 vUV;",
        "void main() {",
        "   vUV = vec2( uv.x, 1.0 - uv.y );",
        "   gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
        "}"
      ].join("\n"),
      fragmentShader: [
        "uniform sampler2D texture;",
        "varying vec2 vUV;",
        "void main() {",
        " gl_FragColor = texture2D( texture, vUV  ).bgra;",
        "}"
      ].join("\n")
    });

์ƒ‰์ƒ ์œ ํ˜• ๋ฐ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์—…๋ฐ์ดํŠธ ๊ธฐ์–ต

์—ฌ๊ธฐ์—์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค... (Chrome 55, OSX)

screen shot 2016-12-20 at 18 05 29

์ด ๋ฌธ์ œ๋Š” HLS ์ŠคํŠธ๋ฆผ๊ณผ Safari, ํŠนํžˆ IOS๊ฐ€ ์žˆ๋Š” ๋น„๋””์˜ค ํ…์Šค์ฒ˜์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

meshbasic_frag์˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ํ…์Šค์ฒ˜๊ฐ€ ์ ์šฉ๋˜๋Š” ๋ฐฉ์‹์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ทธ๊ฒƒ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

equirect_frag ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉ ์ค‘์ด๊ฑฐ๋‚˜ ์„ ํƒ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

gl_FragColor = vec4( outgoingLight, diffuseColor.a );

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ณด๋Š” ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

meshbasic_frag ๋ฐ equirect_frag ์€ ์žŠ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ด๊ฒƒ์„ ๋Œ€์ฒดํ•˜์‹ญ์‹œ์˜ค.

var loader = new THREE.TextureLoader();
var texture = loader.load( 'https://threejs.org/examples/textures/2294472375_24a3b8ef46_o.jpg');

๋‹ค์Œ๊ณผ ๊ฐ™์ด

var video = document.getElementById( 'video' );
var texture = new THREE.VideoTexture( video );

@mrdoob

๋’ท๋ฉด์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค. ์ด ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์€ ํ™•์‹คํžˆ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ๋ณด๋‹ค ํ›จ์”ฌ ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‚ฌ์šฉ์ž ์ •์˜ ์…ฐ์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›๋ž˜ FlipY ์ˆ˜์ • ์‚ฌํ•ญ์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

for (var i = 0; i < uv.count; i++) {
    uv.setY (i, 1 - uv.getY (i));
}

์ •์  ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ๊ณ  x๋Š” ๋’ค์ง‘ํ˜”๊ณ  y๋Š” ๋ฐ˜์ „์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„์— ์˜ฌ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

var uniforms = {
    texture: { value: texture }
};

var vertexShader = [
    "varying vec2 vUV;",
    "void main() {",
    "   vUV = vec2( uv.x, 1.0 - uv.y );", // fipY: 1.0 - uv.y
    "   gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
    "}"
].join( "\n" );

var fragmentShader = [
    "uniform sampler2D texture;",
    "varying vec2 vUV;",
    "void main() {",
    "   gl_FragColor = texture2D( texture, vUV ).bgra;",
    "}"
].join( "\n" );

var material = new THREE.ShaderMaterial( {
    uniforms: uniforms,
    vertexShader: vertexShader,
    fragmentShader: fragmentShader,
    //side: THREE.BackSide
});

์ด ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์€ ํ™•์‹คํžˆ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ๋ณด๋‹ค ํ›จ์”ฌ ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋งˆ๋ฒ•! ๐Ÿ˜‰

@mrdoob ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์ฑ”ํ”ผ์–ธ. ์†Œ์Œ์— ๋Œ€ํ•ด ๋ฏธ์•ˆํ•˜์ง€๋งŒ ์ด๊ฒƒ์— ๋Œ€ํ•ด Apple์„ ๋‹ค์‹œ ๋น„๋‚œํ•˜์‹ญ์‹œ์˜ค.

๋”ฐ๋ผ์„œ ์ •๋ฐฉํ˜• ๋น„๋””์˜ค์˜ ๊ฒฝ์šฐ ๋ฐ๋ชจ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๋น„๋””์˜ค ํ…์Šค์ฒ˜์—๋Š” MeshBasicMaterial์ด ์‚ฌ์šฉํ•˜๋Š” ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ธŒ๋ผ์šฐ์ €์™€ ๋‹ค์–‘ํ•œ ๋น„๋””์˜ค ํ˜•์‹์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ซ์„๊นŒ?

์—…๋ฐ์ดํŠธ๋œ ๋ฐ๋ชจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/threejs-bgra.html

๋”ฐ๋ผ์„œ ์ •๋ฐฉํ˜• ๋น„๋””์˜ค์˜ ๊ฒฝ์šฐ ๋ฐ๋ชจ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๋น„๋””์˜ค ํ…์Šค์ฒ˜์—๋Š” MeshBasicMaterial์ด ์‚ฌ์šฉํ•˜๋Š” ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ธ€์Ž„, MeshBasicMaterial ๋Š” ๋” ์œ ์—ฐํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์€ ์…ฐ์ด๋”๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ํŠน์ •ํ•œ ๊ฒฝ์šฐ์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ์…ฐ์ด๋”๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‹ซ์„๊นŒ?

๋„ค!

IOS 10์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ง€ ํ”„๋ ˆ์ž„์ด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ‹ฐ์ผ“์„ ๋Š๊ฒ ์Šต๋‹ˆ๋‹ค.

var vertexShader = [
    "varying vec2 vUV;",
    "void main() {",
    "   vUV = vec2( uv.x, uv.y );", // fipY: 1.0 - uv.y
    "   gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
    "}"
].join( "\n" );

var fragmentShader = [
    "uniform sampler2D texture;",
    "varying vec2 vUV;",
    "void main() {",
    "   gl_FragColor = texture2D( texture, vUV );",
    "}"
].join( "\n" );

ํ”Œ๋ฆฌํ”ผ๋ฅผ ์•ฝ๊ฐ„ ์กฐ์ •ํ•˜๋ฉด ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์ด webm์œผ๋กœ ํฌ๋กฌ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@mrdoob ์ด ์…ฐ์ด๋”๋Š” ๋น„๋””์˜ค ํ…์Šค์ฒ˜๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ฆฝ ์ˆ˜์ • "1.0 - uv.y"๋Š” Safari์˜ HLS์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ ์ฑ„๋„ ๋ฐ˜์ „์€ HLS๊ฐ€ ์žˆ๋Š” IOS10์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

CORS ํ”„๋ก์‹œ๋ฅผ ํฌํ•จํ•˜์—ฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ๊ฝค ๋ฏธ์นœ ๋ ˆ์ด์–ด.

๋‚˜๋Š” ์ด๊ฒƒ์ด meshbasicmaterial์—์„œ ์ œ๊ณตํ•˜๋Š” ์…ฐ์ด๋”๋ณด๋‹ค ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋น„๋””์˜ค ํ…์Šค์ฒ˜์˜ ํ‘œ์ค€์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ํšŒ์ „์€ ์ •์  ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„
HLS ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ(.m3u8์ด hls.js๋กœ ์žฌ์ƒ๋จ)์„ ํ‘œ์‹œํ•˜๋Š” three.js๋กœ 360vr ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
webgl์ด ํ™œ์„ฑํ™”๋œ Safari osx์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ ipad 10.2์—์„œ๋Š” ๋ชจ๋“  ์‹œ๋„๊ฐ€ ๊ฒ€์€์ƒ‰ ์บ”๋ฒ„์Šค์—์„œ ๊ธธ์„ ์žƒ์Šต๋‹ˆ๋‹ค(์‚ฌ์šด๋“œ๊ฐ€ ์ž‘๋™ํ•จ)
vr360 ๋ชจ๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋น„๋””์˜ค ์ŠคํŠธ๋ฆผ์ด ๋ชจ๋“  ์žฅ์น˜์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ œ์•ˆ๋œ ๋ฐฉ๋ฒ• ์ค‘ ์ผ๋ถ€๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฒ€์€์ƒ‰ ์บ”๋ฒ„์Šค ๋ Œ๋”๋ง์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

FlipY ๋ฐ ์ƒ‰์ƒ ์ฑ„๋„ ๋ฐ˜์ „ ์ˆ˜์ • ์‚ฌํ•ญ์€ ์ด ์Šค๋ ˆ๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ถ”์ ํ•œ Webkit ๋ฒ„๊ทธ๋Š” ์˜ค๋ž˜๋˜์—ˆ๊ณ  ๊ฒฐ๊ตญ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์˜ค๋งŒํ•จ์„ ๊ทน๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์—ด๋ ค ์žˆ์ง€๋งŒ ์•„๋ฌด๋„ ๊ทธ๋“ค์„ ์ณ๋‹ค๋ณด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Safari์šฉ FlipY ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ three.js ํ…์Šค์ฒ˜์—์„œ ์—ฌ์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ์€ ๋‚ด ํ”Œ๋ ˆ์ด์–ด ์†”๋ฃจ์…˜์„ ์œ„ํ•ด ๊ณ ์•ˆํ•œ ๊ณต์‹์ ์ธ es6 ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์‚ฌ๋ƒฅ ํ•œ ํ›„์—๋„ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์—ฌ์ „ํžˆ ์•…๋ชฝ์„ ๊พธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

shadermaterial ์†”๋ฃจ์…˜์„ ์ œ์•ˆํ•œ mrdoob ์ฑ”ํ”ผ์–ธ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•œ ์…ฐ์ด๋”์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋น„๋””์˜ค ํ…์Šค์ฒ˜๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 static getVertexShader(unflipY) {
        return [
            "varying vec2 vUV;",
            "void main() {",
            "   vUV = vec2( uv.x, " + (unflipY ? "1.0 - uv.y" : "uv.y") + ");", // fipY: 1.0 - uv.y
            "   gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
            "}"
        ].join( "\n" );
    }

    static getFragmentShader(invertColour) {
        return  [
            "uniform sampler2D texture;",
            "varying vec2 vUV;",
            "void main() {",
            "   gl_FragColor = texture2D( texture, vUV )" + (invertColour ? ".bgra" : "") + ";",
            "}"
        ].join( "\n" );
    }

    static createShaderMaterial(texture, unflipY, invertColour) {

        texture.flipY = !unflipY;

        if (invertColour) {
            texture.format = THREE.RGBAFormat;
        }

        return new THREE.ShaderMaterial( {
            uniforms: { texture: { value: texture } },
            vertexShader: WebVRUtils.getVertexShader(unflipY),
            fragmentShader: WebVRUtils.getFragmentShader(invertColour)
        });
    }

์šฉ๋ฒ•

 let invertColour = false;

        if (WebVRUtils.isSafari) {
            this.hasHLS = hasHls;
            invertColour = hasHls && WebVRUtils.isIpad;
        }

        this.material = WebVRUtils.createShaderMaterial(this.texture, this.hasHLS, invertColour);

ok three.js์˜ _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY) ์ค„์— ๋Œ€ํ•œ ์ฃผ์„์€ Safari(10.0.2, ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ๊ฐœ๋ฐœ ๋„๊ตฌ์—์„œ webgl๋งŒ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜์„ ์ง€๊ธˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ) ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” iPad ๋ฐ iPhone(๋‚ด ๋Œ€์ƒ)
shaderMaterial ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ๋‚ด ์ฝ”๋“œ์— ์ •ํ™•ํžˆ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค...
๋‹น์‹ ์˜ ์ง€์›์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

๋‚ด ํ…Œ์ŠคํŠธ์—์„œ FlipY ๋น„ํ™œ์„ฑํ™”๋Š” MacOs Safari 10์—๋„ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ(์ด์ „ 9.xx ๋ฒ„์ „ ์ œ์™ธ)
ํ•˜์ง€๋งŒ ์†”๋ฃจ์…˜์ด ๋‚ด ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ๋„๋ก ๋ชจ๋ฐ”์ผ ์žฅ์น˜์—์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.-(

IOS์—์„œ๋Š” FlipY ์ˆ˜์ •๊ณผ ์ƒ‰์ƒ ์ฑ„๋„ ๋ฐ˜์ „์ด ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  IOS 10์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. IOS 9์—์„œ๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋งŽ์€ ๊ตฌํ˜• ์žฅ์น˜๊ฐ€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. Apple์ด ๋‚ด Ipad 3์ฒ˜๋Ÿผ ๊ทธ๊ฒƒ๋“ค์„ ํ‰๊ฐ€์ ˆํ•˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. IOS 10์€ ์ธ๋ผ์ธ ์žฌ์ƒ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ์–ด์จŒ๋“  ๋ฐ”๋žŒ์งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ iOS์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋Œ“๊ธ€์ด ์ข€ ํ—ท๊ฐˆ๋ฆฌ๋„ค์š”.

HLS ๋น„๋””์˜ค์˜ ๊ฒฝ์šฐ:

  • iOS๋Š” ์ž˜๋ชป๋œ ์ˆœ์„œ๋กœ ์ƒ‰์ƒ ์ฑ„๋„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(rgba ๋Œ€์‹  bgra). ๊ฐ’์€ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.
  • macOS๋Š” X์ถ•์„ ๋’ค์ง‘์–ด์•ผ ํ•˜๋Š” ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. setPixelStorei(UNPACK_FLIP_Y_WEBGL, true)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • iOS๋Š” X์ถ•์—์„œ ๋Œ€์นญ ์ด๋™์ด ํ•„์š”ํ•œ ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ์œ„์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์˜ฌ๋ฐ”๋ฅธ์ง€?

๋‹ต์€ ์œ„์˜ ํ‹ฐ์ผ“์— ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋“ฏ์ด, ๋ถ„๋ช…ํžˆ ์ตœ์‹  iOS 10.3.3 ์—…๋ฐ์ดํŠธ๊ฐ€ bgr ๋ฌธ์ œ๋ฅผ ์ˆ˜์ • ํ•˜์—ฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ...

์˜ˆ์ƒ๋Œ€๋กœ. ๊ฝค ํ‘œ์ค€. ์ถฉ๊ณ  ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ์˜ณ์€ ์ผ์„ ํ•ด์•ผ ํ•˜๊ณ  ๋‚ด๊ฐ€ ๋งŒ๋“  ํ‹ฐ์ผ“์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๊ณ  ๋ฏธ๊ฐœ๋ด‰ ์ƒํƒœ๋กœ ๋‚จ๊ฒจ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์•„์ง ~ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์ด์ œ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

IOS 11์—๋Š” CORS ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค.

xcode 9 ๋ฒ ํƒ€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ 10.3.3 ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ 10.3.1 ๋ฐ 11๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 11์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ๋ฐ˜์ „๋œ rgba๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋…น์ƒ‰ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ํ‘œ์‹œ๋˜๊ฑฐ๋‚˜ ์ „ํ˜€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

IOS11 ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์—‰๋ง์ž…๋‹ˆ๋‹ค. 10.3.3 IOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. IOS11์—๋Š” CORS๊ฐ€ ์ˆ˜์ •๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์ œ iOS 11์ด ๋Œ€์ค‘์—๊ฒŒ ๊ณต๊ฐœ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋ฉฐ iPhone iOS 11(์•„์ง iPad๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)์— ๋Œ€ํ•œ ์ด ์Šค๋ ˆ๋“œ์˜ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

HLS๊ฐ€ ์žˆ๋Š” iPhone ๋ฐ iPad์˜ iOS 10.3.3์—์„œ CORS ํ•ต, FlipY ๋ฐ ์ƒ‰์ƒ ์ˆ˜์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
iPhone iOS 11์—๋Š” HLS๊ฐ€ ์žˆ๋Š” ๊ฒ€์€์ƒ‰ ํ™”๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค(CORS ํ•ต, FlipY ๋ฐ ์ƒ‰์ƒ ์ˆ˜์ • ์‚ฌ์šฉ). ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ด ๋” ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์•„์ง๊นŒ์ง€๋Š” ์†๊ฐ€๋ฝ์„ ๋Œ€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

CORS ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ iOS 11์—์„œ๋Š” ์ตœ์†Œํ•œ MP4 ์ ์ง„์  ๋‹ค์šด๋กœ๋“œ์— ๋Œ€ํ•ด ๊ฐœ์„ ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ์œ„์˜ ์ด์œ ๋กœ HLS์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋” ์šด์ด ์ข‹๋‹ค๋ฉด ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค :/

IOS11๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ipad๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—๋ฎฌ๋ ˆ์ดํ„ฐ์—๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ด ์—†์œผ๋ฏ€๋กœ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ์—์„œ ์นด์šดํ„ฐ ํ•ดํ‚น์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” rgb ์ƒ‰์ƒ ์ฑ„๋„์„ ๋‹ค์‹œ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ.

HLS์˜ ๊ฒ€์€์ƒ‰ ๋ Œ๋”๋ง์€ ์ข‹์€ ์‹œ์ž‘์ด ์•„๋‹ˆ๋ฉฐ ํšŒ๊ท€๋ฅผ ๋˜๋Œ๋ฆฌ๋Š” ๋ฐ ๋ช‡ ๋…„์ด ๊ฑธ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉํ•ด ํ–‰์œ„์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด IOS9์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

CORS๋Š” IOS11์—์„œ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋ฉฐ ํ”„๋ก์‹œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@danrossi ์ €๋„ ํ˜„์žฌ iOS 11์—์„œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. iOS 10์€ ์—ฌ์ „ํžˆ โ€‹โ€‹CORS ์ˆ˜์ • ๋ฐ Flip Y๋กœ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ iOS 11์€ ์˜ค๋””์˜ค๋งŒ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค.

IOS11์ด ์„ค์น˜๋œ ์ƒˆ ipad๋ฅผ ๊ตฌ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. HLS๊ฐ€ IOS11 ๋ฒ ํƒ€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? CORS์™€ ๊ด€๋ จ๋œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. rgb ์ฑ„๋„ ํ”Œ๋ฆฝ์€ ๋ฐ˜์ „๋œ ์ƒ‰์ƒ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒ€์€์ƒ‰์€ CORS์™€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

CORS ํ”„๋ก์‹œ ์—†์ด ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๊ทธ๊ฒƒ์„ ์œ„ํ•ด Flip Y ์—†์ด ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ”๋€Œ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์†Œ๋ฆฌ๋งŒ ์žˆ๊ณ  ์˜์ƒ์€ ์—†์Šต๋‹ˆ๋‹ค :/

ios11 ์žฅ์น˜์—์„œ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์†Œ๋ฆฌ๋งŒ ์žˆ๊ณ  ๋น„๋””์˜ค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋น„๋””์˜ค๋ฅผ 2D ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น 2D ์บ”๋ฒ„์Šค๋ฅผ webgl์˜ ํ…์Šค์ฒ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

ios11์—์„œ 2D ์บ”๋ฒ„์Šค ํ…์Šค์ฒ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ์•„์ฃผ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์บ”๋ฒ„์Šค ๋“œ๋กœ์ž‰์€ ํ”„๋กœ์„ธ์„œ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์›นํ‚ท ํ‹ฐ์ผ“์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ์ „ํ˜€ ๋‹ค๋ฃจ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ’€ ์…ฐ์ด๋”์™€ ์†Œ์Šค ์ฝ”๋“œ๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ์ง€๊ธˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์ƒˆ ์žฅ์น˜๋ฅผ ์–ป์„ ๋•Œ๊นŒ์ง€ ์•„์ง ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Iphone 5์กฐ์ฐจ๋„ IOS 11์„ ์–ป์„ ์ˆ˜ ์—†๋Š” ๊ณ„ํš๋œ ๋…ธํ›„ํ™”์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ํ‹ฐ์ผ“์ด ๋˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://bugs.webkit.org/show_bug.cgi?id=163866#c17

@LoveLetterIloveU๋Š” ์—ฌ๊ธฐ ๋‚ด ์ƒ˜ํ”Œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค: https://htmlvideocanvas-sibabi.c9users.io/hello-world.html (ios์—์„œ๋งŒ ์—ด๊ธฐ)
@danrossi ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์˜ memcopy๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Apple์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋™์•ˆ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ‰๊ฐ€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ mp4 ๋Œ€์ฒด ๋ฐฉ๋ฒ•๋„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์…ฐ์ด๋”๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ๋„์›€์œผ๋กœ ์œ„์˜ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๋ฐ ๋‘ ๋‹ฌ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ flipy / HLS / webgl ๋ฌธ์ œ๋ฅผ ์ „ํ˜€ ์‹œ๋„ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ ค๊ณ  ์• ์“ฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋“  ํ‹ฐ์ผ“์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๊ฒฐ๊ตญ CORS ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๋“ค์ด Dash๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€ ์•„์ง ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ.

์• ํ”Œ/์›นํ‚ท์€ ๋‚ด ํŽธ์— ์žˆ๋Š” ๊ฐ€์‹œ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ง์ ‘ ๊ฐ€์„œ ๊ณ ์ณ์•ผ ํ•˜๊ณ  C++๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์น˜๋ฉด ์ •๋ง ์›ƒ๊ธฐ๊ฒ ์ง€๋งŒ ๋จธ๋ฆฌ๋Š” ๊ณ„์† ์œ ์ง€ํ•˜๊ณ  ์‹ถ์–ด์š”.

FlipY๊ฐ€ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ˆ„๊ตฐ๊ฐ€ ์ €๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ ๋‚ด ์˜๊ฒฌ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์ด ๋ฐฉํ•ด ๊ณต์ž‘์„ ์™„์ „ํžˆ ๋ฐฐ๋ถ€๋ฅด๊ฒŒ ๋จน์—ˆ์Šต๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜์—์„œ flipY๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ทธ๋ฆผ์ด ํ‘œ์‹œ๋˜์ง€๋งŒ ๊ฑฐ๊พธ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๊ฒ€์€์ƒ‰ ํ”„๋ ˆ์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ IOS9์—์„œ ๋ฌธ์ œ์˜€๋˜ ํšŒ๊ท€๋ฅผ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค.

https://bugs.webkit.org/show_bug.cgi?id=163866#c19

ํ•œ ๋ฒˆ๋„ ๋ณด๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์›๋ž˜ ์›นํ‚ท ํ‹ฐ์ผ“์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฆ๊ฑฐ๋ฅผ ๋ชจ์œผ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๊ณง ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.

์›๋ž˜ FlipY ๋ฌธ์ œ๋ฅผ ๋„˜์–ด์„ฐ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ OS๋ฅผ ์ถœ์‹œํ•˜๊ธฐ ์ „์— HLS๊ฐ€ WebGL๊ณผ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์›๋ž˜์˜ ์›นํ‚ท ํ‹ฐ์ผ“์„ ๋‹ซ์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ webgl์ด ์žˆ๋Š” HLS ๋น„๋””์˜ค ํ…์Šค์ฒ˜๋Š” ์•„์ง ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์—†์–ด ์™„์ „ํžˆ ๊นจ์กŒ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋” ์ด์ƒ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  webkit webgl ์ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ Mp4๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ Apple์˜ ์ž์ฒด ์ŠคํŠธ๋ฆฌ๋ฐ ํ˜•์‹์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒ ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด IOS 11 ์—…๋ฐ์ดํŠธ๋กœ ๊ณ ์žฅ ๋‚ฌ๊ณ  ์—ฌ์ „ํžˆ ๊ณ ์žฅ๋‚œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

https://bugs.webkit.org/show_bug.cgi?id=163866#c22

@danrossi ์ƒˆ๋กœ ์˜คํ”ˆํ•œ ์›นํ‚ท ํ‹ฐ์ผ“ ๋งํฌ ์žˆ๋‚˜์š”? ์ €๋Š” iOS11์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์œผ๋ฉฐ ๋ชจ๋“  ๊ฐœ๋ฐœ์„ ์ถ”์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋“ค์„ ์œ„ํ•ด ๊ทธ๋“ค์˜ ์ž‘์—…์— ์ž์ฒด ์ž๊ธˆ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Khronos ํ…Œ์ŠคํŠธ mp4 ํŒŒ์ผ์—์„œ ์ƒ์„ฑ๋œ HLS๋กœ ์ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ต๊ณผํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”์ง€ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์บ”๋ฒ„์Šค๋Š” ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค IOS์—์„œ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

HLS ํ…์Šค์ฒ˜๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ๊ตฌ์ถ•ํ–ˆ๊ณ  ํ‹ฐ์ผ“์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์—…๋กœ๋“œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

webgl ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ง€๋‚œ๋ฒˆ์ฒ˜๋Ÿผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›นํ‚ท ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ๋ณด๋Š” ํ•œ ์ข‹์Šต๋‹ˆ๋‹ค. IOS ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์žฌ์ƒํ•  ์‚ฌ์šฉ์ž ํด๋ฆญ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์†์„ฑ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์ง€๋งŒ HLS๋Š” ์—ฌ์ „ํžˆ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ Mp4๋Š” IOS 11์—์„œ ๋ฐœ๊ฒฌํ•œ ์ž๋™ ์žฌ์ƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

IOS๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์ˆ˜ํ–‰๋œ ํ…Œ์ŠคํŠธ๋Š” ์—†์œผ๋ฉฐ HLS์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌธ์ œ. ๊ทธ๊ฒƒ์€ ๋‚˜์œ ์ด์ƒ์ž…๋‹ˆ๋‹ค.

ํ‹ฐ์ผ“์„ ์ œ์ถœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ๋Œ€ํ•œ ๋ฉ€๋ฆฌ ๋ณผ ์ˆ˜. webgl ์›นํ‚ท ํ…Œ์ŠคํŠธ์— ๊ฒฐํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ webgl ์บ”๋ฒ„์Šค ์ถœ๋ ฅ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋งค์šฐ ์ž‘์€ ํฌ๊ธฐ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ถœ๋ ฅ์œผ๋กœ ์บ”๋ฒ„์Šค์— ๋น„๋””์˜ค๋ฅผ ๊ทธ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ webgl ์บ”๋ฒ„์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง ์—ฌ๋ถ€๋„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

HLS์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ์ง€๋งŒ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ webgl ์บ”๋ฒ„์Šค์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๊ฒ€์€์ƒ‰์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ํ›„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹ค์ œ๋กœ IOS์—์„œ ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ HLS์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ํ…Œ์ŠคํŠธ์— ๊ฒฐํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ๋ชจ๋‘๋ฅผ ๋ฐฉํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Apple๊ณผ ๊ทธ๋“ค์˜ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฐœ์ธ ์ž‘์—…์ด ํ•„์š”ํ•œ์ง€ ์ฐธ์„์„ฑ์„ ์žƒ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

https://bugs.webkit.org/show_bug.cgi?id=179417

์ดํ‹€์ด๊ณ  ๋ณผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฒฐ์ฝ” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. CORS๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋ช‡ ๋…„์ด ๊ฑธ๋ ธ๊ณ  ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ IOS์™€ ์žฅ์น˜ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” webgl ํ”Œ๋ž˜๊ทธ์™€ ์…ฐ์ด๋” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ๊ฑฐ๊ธฐ์— ๊ฐ€์„œ ์•ฝ๊ฐ„์˜ ์†Œ์Œ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„์ง ์‚ดํŽด๋ณด์ง€๋„ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋“ค์€ ์‹ค์ œ๋กœ ์ž์ฒด ๋ธŒ๋ผ์šฐ์ €์—์„œ HLS๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ.

@jernoble ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์›นํ‚ท ํŒ€์—์„œ ๋ˆ„๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ์ง€์ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ฑฐ๋‚˜ ์šฐ๋ฆฌ์—๊ฒŒ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. GitHub์˜ ๋ฌธ์ œ๋Š” ๊ฝค ๊ธธ์ง€๋งŒ ์—ฌ๊ธฐ์— ์š”์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: https://bugs.webkit.org/show_bug.cgi?id=179417. ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @radiantmediaplayer์ž…๋‹ˆ๋‹ค. @grorg ์™€ ์ €๋Š” ๋ชจ๋‘ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ž„์ž์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” WebKit ๋ฒ„๊ทธ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์ด๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ ˆ์ด๋”๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–˜๋“ค ์•„. @sorob์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์ž„์‹œ ์บ”๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iOS 11์— ๋Œ€ํ•œ ์ƒ˜ํ”Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. http://redgetan.cc/demo/ios_11_hls_webgl_canvas_workaround/index.html ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜

์บ”๋ฒ„์Šค ๋ Œ๋”๋Ÿฌ. ๊ทธ๊ฒƒ์€ ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋ง์ž…๋‹ˆ๋‹ค. ์ƒ์‚ฐ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ ์—

@danrossi ๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์—ด์–ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. Three.JS์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ ์•„์นด์ด๋ธŒ์šฉ์œผ๋กœ ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค.

์š”๊ตฌ๋˜๋Š” ์‹œํ—˜์˜ ์ˆ˜์ค€์€ ๋ฏธ์ณค๋‹ค. IOS10 ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ—ˆ๋ฆฌ๊ฐ€ ๋ถ€๋Ÿฌ์กŒ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ ์ข€ ๋ด.

์ง€๊ธˆ๊นŒ์ง€ ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋งˆ์นจ๋‚ด ์šฐ๋ฆฌ์˜ ํ†ต์ œ๊ฐ€ ์•„๋‹Œ ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. HLS๋ฅผ ๋ณด๋Š” ํ…์Šค์ฒ˜์˜ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ๊ณต์œ  ์ฐธ์กฐ์™€ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” Mp4์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ชจ์œผ๋Š” ํ•œ ๊ทธ๋“ค์€ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์„ ๋ณด๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค. Windows์—์„œ์™€ ๊ฐ™์€ ๋นŒ๋“œ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์›นํ‚ท ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด IOS10์— HLS์— ์ด์ƒํ•œ ์ƒ‰์ƒ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ์ด์œ ๊ฐ€ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ ๊ณต๊ฐ„ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ IOS10/Safari์—์„œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ•ด๊ฒฐํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

https://bugs.webkit.org/show_bug.cgi?id=179417

์•ˆ๋…•ํ•˜์„ธ์š”. IE11 ๋น„๋””์˜ค ํ…์Šค์ฒ˜ ์ง€์›์„ ์œ„ํ•ด ์บ”๋ฒ„์Šค ๋ Œ๋”๋Ÿฌ๋ฅผ ๋กค๋ฐฑํ•˜๊ณ  ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. WebGL์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌป๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ์ˆ˜๋ฆฌํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์†๋„๋ฅผ ์ƒ๊ฐํ•˜๋ฉด 2๋…„ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IOS 11์€ HLS์— ๋Œ€ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋ง์œผ๋กœ ์–ด๋ ค์›€์„ ๊ฒช์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํœด์ง€ํ†ต์—๋Š” ๋ชจ๋“  IOS๊ฐ€ VR์šฉ์ž…๋‹ˆ๋‹ค. ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@redgetan , three.js๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? CanvasRenderer๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”๋ฐ ํ…์Šค์ฒ˜ ์œ„์— ๋ฉ”์‹œ ํ”„๋ ˆ์ž„์ด ํ‘œ์‹œ๋˜๊ณ  spheregeometry๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์บ”๋ฒ„์Šค 3 ๋ฐ๋ชจ๋Š” ๋ Œ๋”๋ง๋˜๋Š” 2D ๋น„๋””์˜ค๋งŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. webgl render๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์บ”๋ฒ„์Šค๋ฅผ ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ์บ”๋ฒ„์Šค๋ฅผ ํ…์Šค์ฒ˜๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง ๋ฐ ํšŒ์ „๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ์–ด๋–ค ์ด์œ ๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์„ํ•ด์•ผํ–ˆ๋‹ค.

webgl ๋ Œ๋”๋Ÿฌ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์บ”๋ฒ„์Šค ์งˆ๊ฐ๊ณผ ๋น„๋””์˜ค ๋“œ๋กœ์ž‰์˜ ๊ฒฝ์šฐ ์น˜์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

imageContext.drawImage( video, 0, 0, image.width, image.height );

์ง€๊ธˆ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. IOS 11์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

@danrossi ๋Š” iOS 11์—์„œ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ์•Œ๋ ค ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์–ด๋Š ์‹œ์ ์—์„œ ๊ทธ ๊ธธ์„ ๊ฐ€์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ์•˜์–ด์š”, ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. fps ํ†ต๊ณ„ ๋ณด๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉด ๊ณง ์˜จ๋ผ์ธ์œผ๋กœ ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IOS์—์„œ ํ”„๋กœ์„ธ์„œ ์„ฑ๋Šฅ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์บ”๋ฒ„์Šค ์งˆ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€๋งŒ ๋” ํฐ ํ•ด์ƒ๋„์˜ ๋น„๋””์˜ค๋Š” ๋„˜์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด HLS๋Š” ํ’ˆ์งˆ์ด ๋‚ฎ์œผ๋ฏ€๋กœ 40fps๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋” ํฐ ํ•ด์ƒ๋„์˜ mp4์ด์ง€๋งŒ ๋‚ฎ์€ ํ’ˆ์งˆ์€ 30fps๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜ ํ•ด์ƒ๋„ ํŒŒ์ผ์€ 10fps๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ์•„์ดํŒจ๋“œ์šฉ์ž…๋‹ˆ๋‹ค.

http://dev.electroteque.org/webgl/three-canvas.html

์ด ๋ฌธ์ œ๋Š” ์ง€๊ธˆ ์ด ํŽ˜์ด์ง€์—์„œ ์ง๋ฉดํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? https://digitalejulegaver.firebaseapp.com/#catarina

Mac์˜ Safari ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” macOS ์žฅ์น˜์—์„œ ์—ฝ๋‹ˆ๋‹ค. ์•„์ดํŒจ๋“œ๋‚˜ ์•„์ดํฐ์€ ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋ชจ์งˆ๋ผ์— ์žˆ๋”๋ผ๋„ ์ด ํ•œ ํŽ˜์ด์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒ€์€์ƒ‰ ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ Mac์˜ ์ผ๋ฐ˜ ํฌ๋กฌ์—์„œ๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@vongohren ์ด ํ‹ฐ์ผ“์—์„œ ์ž‘์—…ํ•œ macOS Safari ๋ฐ ์…ฐ์ด๋”์™€ ํ•จ๊ป˜ HLS์— ๋Œ€ํ•ด ๋ฐœ๊ฒฌํ•œ FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์›นํ‚ท ํ‹ฐ์ผ“์œผ๋กœ ๋Œ์•„์™”๊ณ  ๊ทธ๋“ค์€ 10.13์— ๋Œ€ํ•œ FlipY ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ด ์‹œ์—๋ผ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ macOS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ…Œ์ŠคํŠธํ•  ๊ธฐํšŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” 10.13์— ๋Œ€ํ•œ FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋˜ ๋‹ค๋ฅธ ํ”Œ๋žซํผ ๋ฒ„์ „ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ„์ „ 13 ์ดํ•˜์—์„œ๋Š” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด macOS ๋ฐ IOS์— ๋Œ€ํ•ด ์•ฝ 4๊ฐœ์˜ ๋‹ค๋ฅธ ํ”Œ๋žซํผ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „ ํ™•์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. IOS 11 ๊ฒ€์‚ฌ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ…์Šค์ฒ˜ ๋ Œ๋”๋ง์„ ์ผœ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

10.13์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ๋ชจ๋“  ํ‹ฐ์ผ“์˜ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://bugs.webkit.org/show_bug.cgi?id=179417#c8
https://bugs.webkit.org/show_bug.cgi?id=176491

https://bugs.webkit.org/show_bug.cgi?id=180863#c3

@danrossi Iv๋Š” 10.13์„ ์–ป์—ˆ์ง€๋งŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” three.js ๋ฒ„์ „์€ ์ด๋Ÿฌํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์˜ ์ƒˆ๋กœ์šด ๊ฒƒ์ด๋ฏ€๋กœ ์ ์šฉํ•  ์œ„์น˜๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.
๋‚˜๋Š” data.flipY๋ผ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๊ทธ๊ฒƒ์„ false๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด ์•ฑ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
screen shot 2017-12-25 at 13 26 42

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด three.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/iberezansky/flip-book-jquery

CORS ๋ฌธ์ œ?

์ด๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

http://dev.electroteque.org/webgl/three-hls.html

์•„๋‹ˆ๋ฉด ์ด๊ฑฐ

http://dev.electroteque.org/webgl/three-hls-flipy.html

๋‚ด ๋ฐฉ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋ชฉ๋ก์ด ํ•ด๋‹น ํ‹ฐ์ผ“์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…์Šค์ฒ˜์—์„œ FlipY๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

texture.flipY = false;

๋ชจ๋“  ๊ฒƒ์ด ๋กœ์ปฌ์— ์žˆ์œผ๋ฏ€๋กœ cors๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋‘ ๋งํฌ๋Š” โ€‹โ€‹Mac 10.13์—์„œ ์‚ฌํŒŒ๋ฆฌ์™€ ํฌ๋กฌ ๋ชจ๋‘์—์„œ ๊ฒ€์€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ”Œ๋ฆฝ ๊ธฐ๋Šฅ์€ ๋‹จ์ง€ ๊ทธ๋ฆผ์„ ๋’ค์ง‘๋Š” ๊ฒƒ๋ณด๋‹ค ๋งŽ์€ ์ผ์„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฒ€์€์ƒ‰์ด์—ˆ๋‹ค

10.13์—์„œ FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์†์ƒ๋œ IOS 11๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ข‹์€ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๋ณด๊ณ ํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ๋ฒ„๊ทธ. ๋„ˆ๋ฌด ์ง€์ €๋ถ„ํ•ด์„œ ์ €๋ฅผ ๋ฏธ์น˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. IOS ํ‹ฐ์ผ“์—์„œ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 10.12์—์„œ FlipY ๋ฒ„๊ทธ๋Š” ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ํ‹ฐ์ผ“์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ง€๊ธˆ ๋‚ด VR ๊ธฐ๋Šฅ ์—์„œ์ฒ˜๋Ÿผ . IOS 11 ๋ฐ 10.13์— ๋Œ€ํ•œ ํ”Œ๋žซํผ ๋ฒ„์ „ ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  hls์— ๋Œ€ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋ง ์บ”๋ฒ„์Šค ํ…์Šค์ฒ˜ ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ธฐ๋Šฅ ๊ฒ€์‚ฌ, ํŠนํžˆ cors ์ง€์› ๋˜๋Š” cors ํ”„๋ก์‹œ ์†Œ์Šค ์‚ฌ์šฉ์— ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ •์  ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ด์ œ IOS 11๊ณผ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋ง์„ ์ผ์‹œ์ ์œผ๋กœ ์ผœ๊ธฐ ์œ„ํ•ด 13๋ณด๋‹ค ํฐ ๋ฒ„์ „์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

static get supportsCORS() {
        let testVideo = document.createElement("video"),
            hasCORS = false,
            userAgent = navigator.userAgent;

        testVideo.crossOrigin = "anonymous";
        hasCORS = testVideo.hasAttribute("crossOrigin");
        testVideo = null;

        if (hasCORS) {

            //if (_isSafari = WebVRUtils.safariCheck(userAgent)) {
            if (_isSafari) {
                return WebVRUtils.isNewSafari(userAgent);
            }

            //cors support check for IE 11 support. 
            _corsSupported = true;

            return true;
        }

        return false;

    }
static isNewSafari(userAgent) {
        const osxVersion = /Mac OS X (10[\.\_\d]+)/.exec(userAgent);

        if (osxVersion) {

            //check for safari test to fix HLS problems.
           // _olderSafari = _browserVersion.match(/(\d+).(\d+).?(\d+)?/)[1] <= 10;

            const version = osxVersion[1].split("_")[1];
            return +version >= 12;
        }

        return WebVRUtils.isNewIOS(userAgent);
    }

    static isNewIOS(userAgent) {
        const version = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/)[1];
        _isLatestIOS = (+version >= 11);
        return _isLatestIOS;
    }

๋‹น์‹ ์€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์ผ“์ด ์ •๋ฆฌ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค :D

๋‹ค์Œ์€ ์บ”๋ฒ„์Šค ์งˆ๊ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. IOS 11์šฉ์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. macOS 13 ๋ฒ„์ „ ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 10.13์—์„œ flipY ์ž‘์—…์ด ์ค‘๋‹จ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด? ๊ทธ๋“ค์—๊ฒŒ ๋‹ค์‹œ ๋ณด๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์ „ํ˜€ ๋ชจ๋ฅด๋Š” ์นœ๊ตฌ, ๋‚˜๋Š” ์ž์ฒด ์ž๊ธˆ์œผ๋กœ ๊ทธ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์–ด๋–ค ์ด์ต๋„ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ž์‹ ์˜ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ Apple OS์—์„œ ๊ฑฐ์˜ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ ์™ธ์—๋Š” haha.

์—ฌ๊ธฐ์— ์ง€๊ธˆ ๋‚ด ์ „์ฒด ํ†ตํ•ฉ์ด ์žˆ์œผ๋ฉฐ ์‚ฌ๊ณผ ์ˆ˜์ • ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•œ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ๋ธŒ๋งต ๋น„๋””์˜ค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

https://flowplayer.electroteque.org/vr360/fp6

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ช‡ ๋…„ ์ „์— ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ์•‰์•„ ์žˆ๋Š” ๊ฒƒ์„ ์ฒ˜์Œ ๋ณด๊ณ ํ•œ ์ดํ›„๋กœ ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

์ด๊ฒƒ์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

http://dev.electroteque.org/webgl/three-canvas.html

์—ฌ๊ธฐ ์บ”๋ฒ„์Šค ์งˆ๊ฐ์ด ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ๋งํ•  ๋•Œ ์–ด๋””๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๊นŒ?

๊ทธ ํ”Œ๋กœ์šฐ ํ”Œ๋ ˆ์ด์–ด๋Š” ๋‹ฌ์ฝคํ•ด ๋ณด์ž…๋‹ˆ๋‹ค! ๋งŽ์ด ์‚ฌ์šฉํ•˜์…จ๋‚˜์š”?

์ด ๋งํฌ์—์„œ ๋ฌด์—‡์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? http://dev.electroteque.org/webgl/three-canvas.html?
Chrome - ๋ฒ„์ „ 63.0.3239.84(๊ณต์‹ ๋นŒ๋“œ)(64๋น„ํŠธ) - macOS 10.13.1์—์„œ ์—ด ๋•Œ:
์™ผ์ชฝ ๋ชจ์„œ๋ฆฌ์— FPS ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒ€์€์ƒ‰ ๋ฐฐ๊ฒฝ๊ณผ ๊ฐ€์šด๋ฐ ํ•˜๋‹จ์— AR ํ™œ์„ฑํ™” ๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์„ ํด๋ฆญํ•˜๋ฉด ์„ค์ • ํœ ๊ณผ ๋’ค๋กœ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๋ถ„ํ•  ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์บ”๋ฒ„์Šค ์ž์ฒด๋Š” ๊ฒ€์€์ƒ‰์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

macOS 10.13.1์˜ Safari ๋ฒ„์ „ 11.0.1(13604.3.5)์—์„œ ์—ด ๋•Œ:
์™ผ์ชฝ ๋ชจ์„œ๋ฆฌ์— FPS ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ๋น„ํ–‰ ๋™์˜์ƒ์ด ๋ณด์ด๊ณ  ๊ฐ€์šด๋ฐ ํ•˜๋‹จ์— AR ํ™œ์„ฑํ™” ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด 360๋„ ๊ฒฝํ—˜์„ ์œ„ํ•ด ์Šคํฌ๋กคํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
VR ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์„ค์ • ํœ ๊ณผ ๋’ค๋กœ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๋ถ„ํ•  ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„๋””์˜ค ์บ”๋ฒ„์Šค๋Š” ์Šคํฌ๋กคํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ž์ด๋กœ๊ฐ€ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ VR ๋ชจ๋“œ์—์„œ ๋’ค๋กœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋น„๋””์˜ค๊ฐ€ VR ๋ชจ๋“œ์—์„œ ๋ฉˆ์ถ”๊ณ  ๋” ์ด์ƒ ์Šคํฌ๋กคํ•  ์ˆ˜ ์—†์œผ๋ฉฐ VR ๋ชจ๋“œ๊ฐ€ ์‹œ์ž‘๋œ ๋ณด๊ธฐ์—์„œ ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฐ๋ชจ๋Š” Safari์—์„œ HLS ๋ Œ๋”๋ง์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Safari์—์„œ flipY ์ˆ˜์ • ๋ฐ๋ชจ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒฝ์šฐ

http://dev.electroteque.org/webgl/three-hls-flipy.html

๊ทธ๋Ÿฐ ๋‹ค์Œ 10.13 ๋ฐ IOS 11 Safari์—์„œ ์บ”๋ฒ„์Šค ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

http://dev.electroteque.org/webgl/three-canvas.html

๋‘˜ ์‚ฌ์ด๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”. ๊ฒ€์ •์ƒ‰ ํ”„๋ ˆ์ž„์ด ์•„๋‹Œ ๋ Œ๋”๋ง๋˜๋Š” ํšŒ์ „ ์ปจํŠธ๋กค์— ๋Œ€ํ•ด์„œ๋Š” ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ์—ฌ๊ธฐ์—์„œ ์ฐธ์กฐํ•˜๋Š” IOS 11 ์›นํ‚ท ํ‹ฐ์ผ“์— 10.13์„ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 10.13์— ๋Œ€ํ•ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. HLS ๋ Œ๋”๋ง์„ ์™„์ „ํžˆ ๋ง๊ฐ€๋œจ๋ฆฐ "ํšŒ๊ท€"๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@danrossi๋Š” ๋‘˜ ๋‹ค ์‚ฌํŒŒ๋ฆฌ์—์„œ ์ž‘๋™ํ•˜๋ฉฐ hls ๋ฒ„์ „์œผ๋กœ ๋” ๋†’์€ ํ’ˆ์งˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ๋‘˜ ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๋„ ํฌ๋กฌ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”. ๋ณด๊ณ ๋ฅผ ์ทจ์†Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌธ์ œ๊ฐ€ ๋งž์Šต๋‹ˆ๊นŒ?

http://dev.electroteque.org/webgl/three-hls.html

์ด ๊ฒฝ์šฐ macOS์˜ ํ‘œ์ค€์œผ๋กœ FlipY ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€์˜ HLS ๋ฐ๋ชจ๋Š” ๋‘ ๋ธŒ๋ผ์šฐ์ € ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. hls ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ ํฌ๋กฌ์šฉ ๋ฏธ๋””์–ด ์†Œ์Šค ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ macOS์— ๋Œ€ํ•œ FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://flowplayer.electroteque.org/vr360/fp6

๋‹น์‹ ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€
http://dev.electroteque.org/webgl/three-hls.html
์ด๊ฒƒ์€ ํฌ๋กฌ์ด๋‚˜ ์‚ฌํŒŒ๋ฆฌ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งํฌ flowplayer๋Š” ๋‘ ๋ธŒ๋ผ์šฐ์ € ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์ฑ”ํ”ผ์–ธ. ํ‹ฐ์ผ“์„ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. macOS Safari ๋ฌธ์ œ๋Š” IOS 11 ๋ฌธ์ œ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

IOS 11์šฉ ์บ”๋ฒ„์Šค ํ…์Šค์ฒ˜ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  macOS Safari์˜ ๊ฒฝ์šฐ ํ…์Šค์ฒ˜์—์„œ FlipY๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์…ฐ์ด๋”์—์„œ Y ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ฆฝ๋‹ˆ๋‹ค. IOS 10 HLS์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์—์„œ๋„ ์ƒ‰์ƒ ์ฑ„๋„ ๋ฐ˜์ „์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์…ฐ์ด๋” ์ฝ”๋“œ๋Š” ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์˜ค๋Š˜ ์•„์นจ์— ์œ„์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ iOS 11 ์ผ€์ด์Šค๋ฅผ ๊นจ๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์•ฝ 1์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค( @danrossi ์ €๋Š” http://dev.electroteque.org/webgl/three-canvas.html์— ์žˆ๋Š” ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ์˜๊ฐ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค) ... ํ•˜์ง€๋งŒ ์•ˆ๊ฒฝ์„ ์“ฐ๊ณ  ์‚ฌ๋ง‰์˜ ํƒœ์–‘ ์•„๋ž˜์„œ ์–ผ์Œ ์กฐ๊ฐ์ฒ˜๋Ÿผ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ iOS 11.2.1์ด ์„ค์น˜๋œ iPhone 6 Plus์—์„œ ์–ป์€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์‹ค์ œ๋กœ ๋งค์šฐ ๋ถ€๋“œ๋Ÿฝ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ถ”์•…ํ•˜๊ณ  ํ”ฝ์…€ ํ™”๋˜๊ณ  ์•จ๋ฆฌ์–ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ...
img_0969

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(Android 8 ๋ฐ ์ตœ์‹  Chrome์˜ Nexus 5X - ์œ„์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ).
screenshot_20180103-163108

์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” 360 HTML5 ํ”Œ๋ ˆ์ด์–ด์ด๋ฉฐ ๋น„๋””์˜ค ์œ„์˜ ๋‘ ์ƒ˜ํ”Œ ๋ชจ๋‘ ๋™์ผํ•œ HLS ๋‹จ์ผ ๋น„ํŠธ ์ „์†ก๋ฅ  ํ”ผ๋“œ http://www.rmp-streaming.com :1935/vod/sea360.mp4/playlist.m3u8์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•(๋‚ด ์ฝ”๋“œ๋Š” ์•„๋ž˜ ์ฐธ์กฐ)์„ Android์— ์ ์šฉํ•˜๋ฉด ๋™์ผํ•œ ๋ชป์ƒ๊ธด ๋ Œ๋”๋ง์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด ์ƒˆ๋กœ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์ผ๋ถ€ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์ƒํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ๋ˆˆ์— ๋„๋Š” ๊ฐœ์„ ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    // image 
    this.image360 = document.createElement('canvas');
    this.image360.width = this.width;
    this.image360.height = this.height;
    this.imageContext360 = this.image360.getContext('2d');
    this.imageContext360.fillStyle = '#000000';
    this.imageContext360.fillRect(0, 0, this.width, this.height);
    // texture 
    this.texture360 = new THREE.Texture(this.image360);
    this.texture360.format = THREE.RGBFormat;
    this.texture360.minFilter = THREE.LinearFilter;
    this.texture360.magFilter = THREE.LinearFilter;
    this.texture360.generateMipmaps = false;
    this.texture360.wrapS = THREE.ClampToEdgeWrapping;
    this.texture360.wrapT = THREE.ClampToEdgeWrapping;
    this.texture360.flipY = true;
    this.texture360.needsUpdate = true;
    // mesh
    let geometry = new THREE.SphereGeometry(500, 80, 50);
    geometry.scale(-1, 1, 1);
    let material = new THREE.MeshBasicMaterial({ map: this.texture360 });
    this.mesh360 = new THREE.Mesh(geometry, material);
    this.scene360.add(this.mesh360);
    // renderer
    this.renderer360 = new THREE.WebGLRenderer({ antialias: false });
    this.renderer360.setClearColor(0x101010);
    this.renderer360.setPixelRatio(window.devicePixelRatio);
    this.renderer360.setSize(this.width, this.height, true);

๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ •ํ™•ํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ๊ฝค ํ™•์‹ ํ•œ๋‹ค.

video.addEventListener("loadeddata", function() {
                      video.width = THREE.Math.ceilPowerOfTwo(video.videoWidth);
                      video.height = THREE.Math.ceilPowerOfTwo(video.videoHeight);

                      image.width = video.width;
                      image.height = video.height;
                      //image.width = video.videoWidth;
                      //image.height = video.videoHeight;
                      //imageContext.fillRect( 0, 0, video.videoWidth, video.videoHeight);
                      imageContext.fillRect( 0, 0, image.width, image.height);


                      //console.log(video.videoWidth);
                });

๊ทธ๋ž˜์„œ ์กฐ๊ธˆ ์ฐ”๋Ÿฌ๋ณธ ํ›„ ์ฐ์–ด๋ดค์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ตฌ์„ฑ์—์„œ ์˜คํ”„ ๋” ์บ”๋ฒ„์Šค๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜๊ธฐ ์œ„ํ•ด ์žฌ์ƒ ์ค‘์ธ ํ˜„์žฌ HLS ๋ณ€ํ™˜์˜ ์ •ํ™•ํ•œ ํฌ๊ธฐ์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ABR์˜ ๊ฒฝ์šฐ ๋ณ€ํ™˜์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•จ). ์šฐ๋ฆฌ์˜ ํ…Œ์ŠคํŠธ๋Š” ์ด๊ฒƒ์ด iOS 11์—์„œ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋„์›€์ด๋œ๋‹ค๋ฉด ์—ฌ๊ธฐ์— ๋‚จ๊ฒจ ๋‘์‹ญ์‹œ์˜ค.

์˜ˆ, ๋”ฐ๋ผ์„œ ๋น„๋””์˜ค ๋„ˆ๋น„๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด loaddata ์ด๋ฒคํŠธ์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ „์— ์•Œ์•„ ๋ƒˆ๊ณ  ๋‹น์‹ ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ HLS์˜ ๊ฒฝ์šฐ ๋น„ํŠธ ์ „์†ก๋ฅ ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ํ•œ ๋ฒˆ๋งŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Apple์„ ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ์–‘์€ ์ด๋ฏธ ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋งŽ์Šต๋‹ˆ๋‹ค.

ABR HLS์— ๋Œ€ํ•œ ๋ณ€ํ™˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Safari์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ ๊ฐ AnimationFrame์˜ video.videoWidth ๋ฐ video.videoHeight๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜คํ”„๋” ์บ”๋ฒ„์Šค ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค(์„ฑ๋Šฅ ๊ด€์ ์—์„œ๋Š” ์ด์ƒ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ณ  ๋‹ค๋ฅธ ๋•Œ๊นŒ์ง€ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค). ์šฐ๋ฆฌ์˜ ํ…Œ์ŠคํŠธ๋Š” ์ƒˆ๋กœ์šด ๋ณ€ํ™˜์ด ํ‘œ์‹œ๋  ๋•Œ video.videoWidth ๋ฐ video.videoHeight๊ฐ€ ๊ทธ์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋งŒํผ ์ถฉ๋ถ„ํžˆ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํ”„๋ ˆ์ž„ ์ฝœ๋ฐฑ์— ์กฐ๊ฑด๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๊ณผ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋ฌด์—‡์ด๋“  ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋ณ€ํ™˜ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์— ๋Œ€ํ•œ ์‚ฌ์–‘์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

์ด์ „ Safari ๋ฒ„๊ทธ, HLS ํ”Œ๋ฆฌํ”ผ ์ˆ˜์ • ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ CORS ํ”„๋ก์‹œ, ์ด์ œ ์ด๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ข‹์€ ๋‹ฌ ์ •๋„ ๋™์•ˆ ๋‚ด ํ‹ฐ์ผ“์—์„œ ์•„์ง ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

HTML5 ๋น„๋””์˜ค ์‚ฌ์–‘์—์„œ ํ’ˆ์งˆ ์ „ํ™˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋ณธ ๊ธฐ์–ต์ด ์—†์Šต๋‹ˆ๋‹ค. Apple์—์„œ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” HLS ์‚ฌ์–‘์ด ์žˆ์ง€๋งŒ ํ’ˆ์งˆ ์ „ํ™˜์ด ๋ฐœ์ƒํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. hls.js์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ HLS์—์„œ Safari์˜ ๊ธฐ๋ณธ HTML5 ๋น„๋””์˜ค์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ์ •๋œ ๊ฐ„๊ฒฉ์œผ๋กœ video.videoWidth๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜๋ฉด ํฌ๊ธฐ ์กฐ์ • ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ณ€ํ™˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•ดํ‚น์„ "ํด๋ฆฌํ•„"ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋œ ๊ณผ์„ธ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋งˆ๋„ ์ด๊ฒƒ์„ ์šฐ๋ฆฌ ํ”Œ๋ ˆ์ด์–ด์˜ ๋‚˜์ค‘ ๋‹จ๊ณ„์—์„œ ๊ตฌํ˜„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@radiantmediaplayer "ํฌ๊ธฐ ์กฐ์ •" ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ .videoWidth ๋ฐ .videoHeight ์†์„ฑ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„ ์—ฌ๊ธฐ ๋‚ด ์˜๊ฒฌ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ๋™์ž‘์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‹œ๋ จ์ด์—ˆ๋Š”์ง€. ์ ์ ˆํ•œ ํ”ผ๋“œ๋ฐฑ์ด๋‚˜ ์‘๋‹ต์„ ์–ป์ง€ ๋ชปํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚œ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋๋‚ฌ์–ด! ๋” ์ด์ƒ ํšŒ๊ท€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค !!

OSX 11.3 ๋ฒ ํƒ€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ OSX 11์€ ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋ง์ด ํ•„์š”ํ•˜๊ณ  OSX 10์€ flipY ๋ฐ ์ƒ‰์ƒ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ํ˜ธํ™˜์„ฑ ํ˜ผ๋ž€๊ณผ ํ”Œ๋žซํผ ๋ฒ„์ „ ๊ฐ์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Safari macOS์—๋Š” ์—ฌ์ „ํžˆ FlipY ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ณ„๋„์˜ ํ‹ฐ์ผ“์— ์‘๋‹ต์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด PC ์›Œํฌ์Šคํ…Œ์ด์…˜์— macOS๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์–ด์จŒ๋“  HLS๋ฅผ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. HLS๋Š” vmware์—์„œ ์žฌ์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://bugs.webkit.org/show_bug.cgi?id=179417#c43

FlipY ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ OSX 11.3์—์„œ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด์ „์— ์–ธ๊ธ‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ด์ œ CORS๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ „์ฒด IOS ๋ฐ Safari ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ์ž…๋‹ˆ๋‹ค.

๋งˆ์Œ์ด ํ”๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฑด ๋ฏธ์ณค์–ด. ๋‚˜๋Š” ๋ฏธ๋ž˜๋ฅผ ์ฆ๋ช…ํ•ด์•ผ ํ–ˆ๊ณ  IOS 12๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ์„ ํฌํ•จํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ†ตํ•ฉ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค! ์•„์ง macOS์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

static get supportsCORS() {
        let testVideo = document.createElement("video"),
            hasCORS = false,
            userAgent = navigator.userAgent;

        testVideo.crossOrigin = "anonymous";
        hasCORS = testVideo.hasAttribute("crossOrigin");
        testVideo = null;

        if (hasCORS) {

            //if (_isSafari = WebVRUtils.safariCheck(userAgent)) {
            //Safari still reports CORS support regardless a bug
            if (_isSafari) {
                return WebVRUtils.isNewSafari(userAgent);
            }

            //cors support check for IE 11 support. 
            _corsSupported = true;

            return true;
        }

        return false;

    }

static isNewSafari(userAgent) {
        const osxVersion = /Mac OS X (10[\.\_\d]+)/.exec(userAgent);

        if (osxVersion) {

            //check for safari test to fix HLS problems.
           // _olderSafari = _browserVersion.match(/(\d+).(\d+).?(\d+)?/)[1] <= 10;

            const version = osxVersion[1].split("_")[1];
            return +version >= 12;
        }

        return WebVRUtils.isNewIOS(userAgent);
    }

static isNewIOS(userAgent) {
        const platform = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),
        version = +platform[1];

        _isLatestIOS = version >= 11;

        //if greater than 11.3 or 12
        _iOSHlsSupported = (_isLatestIOS && +platform[2] >= 3 || version >= 12);

        return _isLatestIOS;
    }

์šฉ๋ฒ•

 set hls(value) {

        //if had a HLS source and the current playlist source isn't clear scene and revert the material.
        if (this.hasHls && this.isSafari && !value) {
            this.clearScene();
            this.initScene(value);
        }

        //flipY fix
        this.hasHls = value && this.isSafari;
        //IOS10 colour inversion fix
        this.invertHLS = this.isIpad;

        //if we have hls and IOS 11 or greater
        if (this.hasHls && WebVRUtils.isLatestIOS) {

          //IOS 11.3 or greater disable flipY and colour inversion fixes
          if (WebVRUtils.iOSHlsSupported) {
              this.hasHls = false;
              this.invertHLS = false;
          } else {
            //anything below IOS 11.3 use software rendering
            this.config.software = true;
          }

        }
    }

๋งˆ์ง€๋ง‰์œผ๋กœ ์ค‘์š”ํ•œ ์ ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. IOS HLS ๋ Œ๋”๋ง ๊ตฌํ˜„์€ ์‹ ๋ฐœ๋ˆ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๋งค์šฐ ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์€ loaddata ํ›„์— ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

teximage2d ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋” ์ด์ƒ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๊ฒ€์€์ƒ‰ ๋ Œ๋”๋ง๋งŒ ๋ฐœ์ƒํ•˜๋ฉฐ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ฆ‰์‹œ ๋ Œ๋”๋ง์ด ์‹œ์ž‘๋˜๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. 11.3 ์ด์ „์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋น„๋””์˜ค๊ฐ€ ๋‹ค์‹œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ž„์‹œ ์บ”๋ฒ„์Šค ์ˆ˜์ • ์—†์ด). ์ตœ์‹  ios ๋ฒ„์ „ 11.3(iphone 6s, 7์—์„œ ํ…Œ์ŠคํŠธ)์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, 2์›” 15์ผ์— ์—…๋ฐ์ดํŠธํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 11.3์—์„œ ๋‹ค์‹œ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์€ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผํ–ˆ๊ณ  ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค!

iOS 11.3(๋ฐ ์ด์— ์ƒ์‘ํ•˜๋Š” macOS ๋ฆด๋ฆฌ์Šค)์—์„œ ๋น„๋””์˜ค -> ํ…์Šค์ฒ˜์™€ ๊ด€๋ จ๋œ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ๋‚˜๋Š” ์ง์ ‘ ์ŠคํŠธ๋ฆผ(์˜ˆ: mp4)๊ณผ HTTP ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ์ด ๋ชจ๋‘ ์ž‘๋™ํ•ด์•ผ ํ•˜๋ฉฐ ํ”Œ๋ฆฌํ”ผ๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ ๊ณ ๊ฐ€ ์ ‘์ˆ˜๋œ 2์›”๋ถ€ํ„ฐ ๋ชจ๋‘ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์›๋ž˜ ์ž‘๋…„ ์–ธ์  ๊ฐ€ ๋ณด๊ณ ํ–ˆ๋‹ค. ๋ฌด์ž‘์œ„๋กœ IOS ๋ฒ ํƒ€๋ฅผ 11.3์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ๊ณ  ์ž‘๋™์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ํ˜ธํ™˜์„ฑ ๊ฒ€์‚ฌ ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

IOS 10์—๋Š” flipY ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. IOS 11.0 - 11.2์—๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋ง ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 11.3 > ์ •์ƒ์ ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์ด์— ๋Œ€ํ•œ ์ž‘์—… ์ƒ˜ํ”Œ, jsfiddle ๋“ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? IOS 11 Safari์—์„œ ์—ฌ์ „ํžˆ ๊ฒ€์€์ƒ‰ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋””์˜ค๋Š” ๋“ค์„ ์ˆ˜ ์žˆ์ง€๋งŒ HLS ์ŠคํŠธ๋ฆฌ๋ฐ์— ๋Œ€ํ•œ ๋น„๋””์˜ค๋Š” ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dhanishapa iOS ๋ฒ„์ „์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? 11.3+์ธ๊ฐ€์š”?

์กฐ๊ธˆ ์ „(~ 2018๋…„ 5์›”) ์ €๋„ HLS(? <= 11.2)์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์žฌ์ƒ ์ค‘์— ๋น„๋””์˜ค ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋””์˜ค๊ฐ€ ๋•Œ๋•Œ๋กœ ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ๊ฒ€์€์ƒ‰ ํ™”๋ฉด์ด ํ‘œ์‹œ๋จ
  • ๋น„๋””์˜ค๋Š” ๋ฒ„ํผ๋ง๋˜์ง€๋งŒ ์˜ค๋””์˜ค๋Š” ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

Vimeo์— ์—ฐ๋ฝํ•œ ํ›„(์ €๋Š” HLS ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค) Apple ๊ฐœ๋ฐœ ํŒ€์— ์—ฐ๋ฝํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•จ๊ป˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Apple ๊ฐœ๋ฐœ ํŒ€์œผ๋กœ๋ถ€ํ„ฐ ๊ท€ํ•˜๊ฐ€ ๋ณด๊ณ ํ•œ ์žฌ์ƒ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ์ƒˆ ๋ฒ„์ „์˜ iOS(11.3.1)๊ฐ€ ์ถœ์‹œ๋˜์—ˆ๋‹ค๋Š” ์†Œ์‹์„ ๋ฐฉ๊ธˆ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋น„๋””์˜ค๊ฐ€ ๊ฒ€์€ ํ™”๋ฉด์—์„œ ์ค‘์ง€๋˜๊ฑฐ๋‚˜ ๋น„๋””์˜ค ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๋ฐ˜๋ณต๋˜๊ฑฐ๋‚˜ ๋ฌดํ•œ ๋กœ๋“œ ์ƒํƒœ์— ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—…๋กœ๋“œํ•˜๋Š” ๋™์•ˆ H264๋กœ ์ธ์ฝ”๋”ฉ๋œ MP4๋ฅผ ์†Œ์Šค๋กœ ์ œ๊ณตํ–ˆ์„ ๋•Œ 11.3.1 ๋ฏธ๋งŒ์˜ iOS ๋ฒ„์ „์—์„œ ์žฌ์ƒ ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์—…๋กœ๋“œํ•˜๋Š” ๋™์•ˆ Quicktime์„ ์ž…๋ ฅ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๋น„๋””์˜ค ํŒŒ์ผ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๊ฐ„์˜ ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(๋น„๋””์˜ค ์ฝ”๋ฑ ์ฆ‰, ์ž‘๋™ํ•˜๋Š” ๋น„๋””์˜ค ์ฝ”๋ฑ์€ "avc1.64001E,mp4a.40.2" ๋Œ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋น„๋””์˜ค ์ฝ”๋ฑ "hvc1.2.4.L63.90,mp4a.40.2"). ).

์•„๋งˆ๋„ ์ด ์ •๋ณด๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”
IOS ์‚ฌํŒŒ๋ฆฌ์—์„œ HLS ์ŠคํŠธ๋ฆฌ๋ฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
cors ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ hls ํ”Œ๋ ˆ์ด์–ด์™€ html5 ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜๊ณ  IOS์—์„œ ์ง์ ‘ m3u8 ๋งํฌ๋ฅผ ์žฌ์ƒํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด ์‚ฌํŒŒ๋ฆฌ(๋ฐ์Šคํฌํ†ฑ - ๋งฅ), ํฌ๋กฌ, ํŒŒ์ด์–ดํญ์Šค์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  IOS(์•„์ดํฐ)์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

cors๋Š” IOS 11.0์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ•œ ๋‹ค๋ฅธ ํฐ ์ˆ˜์ • ์‚ฌํ•ญ์€ 11.3์— ์žˆ์Šต๋‹ˆ๋‹ค. 11.3์€ ์ง€๊ธˆ ๋‚˜์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก์‹œ๋Š” IOS 10 ๋ฐ 9์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ™†๐Ÿฝโ€โ™‚๏ธ

๋‹ค์Œ์€ ๊ตฌ์— ๋งคํ•‘๋œ HLS ์ŠคํŠธ๋ฆผ playhouse-vr์˜ 360๋„ ๋น„๋””์˜ค ).

2018-08-01 16_56_37

macOS v10.13.4 + Safari v11.1 ๋ฐ iOS 11.4.1 + Safari์—์„œ ํ…Œ์ŠคํŠธ๋จ

์ด์ œ iOS 14.0 Safari ๋ฐ iPadOS 14.0 Safari์—์„œ ์ƒˆ๋กœ์šด ๊ฒ€์€์ƒ‰ ํ™”๋ฉด ๋ฌธ์ œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋˜‘๊ฐ™์€ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ iOS 13.7 Safari ๋ฐ iPadOS 13.7 Safari์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. three.js r120(r116์—์„œ)์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์†Œ์šฉ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. macOS Safari 14๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ฒƒ์„ ๋ณด๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? iOS 14๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ํžŒํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, iOS 14 ํšŒ๊ท€์— ๋Œ€ํ•ด https://bugs.webkit.org/show_bug.cgi?id=215908 ๋ฐ https://bugs.webkit.org/show_bug.cgi?id=216250 ์„ ๋ชจ๋‘ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋งŽ์€ ์‚ฌ์ดํŠธ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ๋ชจ๋‘ ๋นจ๋ฆฌ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Safari์™€์˜ ๋์—†๋Š” ์ „ํˆฌ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์ž์‹ ์˜ 360๋„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์„ ๋‹ค์‹œ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๊ณ ์น˜๋Š” ๋ฐ ๋งค๋ฒˆ ๋ช‡ ๋‹ฌ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์œ„์˜ ์›๋ž˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋” ๋งŽ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค!! Webkit์€ HLS๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์œผ๋ฉฐ WebGL์— ๋Œ€ํ•œ HLS ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ธฐ๋Šฅ์—์„œ ๋‹ค๋ฅธ IOS์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ถ€ํ’€๋ ค์ง„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” 11.0์šฉ ์บ”๋ฒ„์Šค ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค... ์—ฌ์ „ํžˆ ํ”Œ๋žซํผ ํ™•์ธ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IOS 13์—์„œ๋Š” ์ด์ œ ํ”Œ๋žซํผ ๊ฒ€์‚ฌ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŒ์ง€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๊ฒƒ์„ ๊ณ ์ณ์•ผ ํ–ˆ๋‹ค. HLS๊ฐ€ ์ฆ‰์‹œ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ณ  IOS 13์—์„œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. WebXR API๊ฐ€ ์—†์œผ๋ฉฐ Android์™€ ๊ฐ™์€ Wakelock API๊ฐ€ ๋ฐฉ๊ธˆ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ฅด๋ฉด ๋ณ€ํ™˜ ๋ณ€๊ฒฝ ์‹œ ์žฌ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ถค๋„ ์ œ์–ด์—์„œ ํ™•๋Œ€/์ถ•์†Œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ IOS 13์—์„œ ๊ฒ€์€์ƒ‰ ๋ Œ๋”๋ง์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. IOS 14๋Š” ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

            video.addEventListener("resize", () => {
                vrVideo.update();
                vrVideo.fullScreenResize(false);
            });

14.2๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ˆ˜์ •์€ ๊ทธ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰