Pixi.js: Safari์—์„œ WebGL์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๊พธ๋กœ ๋ Œ๋”๋ง

์— ๋งŒ๋“  2016๋…„ 01์›” 12์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pixijs/pixi.js

์•ˆ๋…•ํ•˜์„ธ์š”, ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const filmObj = _getFilmObj() /* draw obj somewhere else */
const renderer_1 = PIXI.autoDetectRenderer(width, height)
renderer_1.render(filmObj)
const filmTexture = new PIXI.Texture(new PIXI.BaseTexture(renderer_1.view))
renderer_1.destroy()

const artboardObj = new PIXI.Sprite(filmTexture)
const renderer_2 = PIXI.autoDetectRenderer(width, height)
renderer_2.render(artboardObj)
const artboardTexture =new PIXI.Texture(new PIXI.BaseTexture(renderer_2.view))
renderer_2.destroy()

/* render artboardTexture somewhere else */

Safari(iOS / Mac OS X)์—์„œ ํ…Œ์ŠคํŠธํ•  ๋•Œ renderer_2.view ๋Š” filmObj ์— ๋Œ€ํ•ด ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘ํžŒ ๋ฐ˜๋ฉด renderer_1.view ๋Š” ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. renderer_2 renderer_1.view ์—์„œ ์ž˜๋ชป๋œ ์ขŒํ‘œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐฉ์šฉํ•œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ถ”๊ฐ€ ์ •๋ณด:

  1. Chrome(๋ฐ์Šคํฌํ†ฑ/๋ชจ๋ฐ”์ผ)์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.
  2. CanvasRenderer ์‚ฌ์šฉํ•˜๋ฉด Safari์—์„œ๋„ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

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

@redsend

toDataURL ๋ฐ getImageData๊ฐ€ WebGL์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์œผ๋ฉฐ ํ‘œ์ค€์—๋„ ์—†์Šต๋‹ˆ๋‹ค. PIXI ์ถ”์ถœ API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//if you want canvas
var canvas =renderer.extract.canvas(stage);
//if you want base64
var base64=renderer.extract.base64(stage);

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

Safari/Firefox/Chrome์—์„œ ํ…Œ์ŠคํŠธํ•œ ๊ฒฐ๊ณผ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
02 01 46

๊ธฐ์ด ํ•œ! ๊ผญ ๋ณด์„ธ์š”..

Safari์—์„œ ์บ”๋ฒ„์Šค๊ฐ€ ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘ํžˆ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ Chrome์—์„œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ Safari์—์„œ baseTexture.flipY = true ์„ค์ •ํ•˜๊ณ  ์•„๋ž˜์˜ ๋”๋Ÿฌ์šด ํ•ดํ‚น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๊ทน๋ณตํ•ฉ๋‹ˆ๋‹ค.

diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js
index 05258f6..82b1c84 100644
--- a/src/core/renderers/webgl/WebGLRenderer.js
+++ b/src/core/renderers/webgl/WebGLRenderer.js
@@ -396,6 +396,9 @@ WebGLRenderer.prototype.updateTexture = function (texture)

     gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]);

+    if (texture.flipY) {
+        gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);
+    }
     gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha);
     gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source);

Sprites์— Sprites๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์บ”๋ฒ„์Šค ํ˜ธ์ถœ toDataURL()์—์„œ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ์ด๋ฏธ์ง€๋Š” ์ตœ์‹  ์‚ฌํŒŒ๋ฆฌ์—์„œ ์ˆ˜์ง์œผ๋กœ ๋’ค์ง‘ํžŒ ๋ฐ˜๋ฉด, ๊ตฌํ˜• ์‚ฌํŒŒ๋ฆฌ(7.1 ํ…Œ์ŠคํŠธ๋จ)์™€ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋’ค์ง‘ํžˆ์ง€ ์•Š์€ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@holymonson ๋น„์Šทํ•œ ํ–‰๋™์ด ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ด์ „ ์‚ฌํŒŒ๋ฆฌ์—์„œ ํ…Œ์ŠคํŠธํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์€ ์‚ฌ๋žŒ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ?

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ฃฝ์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด: ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์ง€ ๋ชปํ–ˆ๊ณ  ๊ฐ•์ œ ์บ”๋ฒ„์Šค ๋ Œ๋”๋ง์œผ๋กœ ๋˜๋Œ์•„๊ฐ€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ WebGL ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. premultipliedAlpha ; ์ œ ๊ฒฝ์šฐ์—๋Š” premultipliedAlpha ๊ฐ€ ๋‘ ๋ฒˆ์งธ ๋ Œ๋”๋Ÿฌ์— ๋Œ€ํ•ด false ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•˜๋ ค๋ฉด ๊ฒฉ๋ฆฌ๋œ ๋ฐ๋ชจ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ทธ๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์‹ซ์ง€๋งŒ ๋จผ์ € ์žฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. Safari์—์„œ toDataURL ๋กœ ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€์—๋งŒ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.
https://jsbin.com/qivife/14/edit?js ,์ถœ๋ ฅ

์ด๋ฏธ์ง€๊ฐ€ ๋’ค์ง‘ํžˆ์ง€ ์•Š์€ toDataURL API๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@redsend

toDataURL ๋ฐ getImageData๊ฐ€ WebGL์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์œผ๋ฉฐ ํ‘œ์ค€์—๋„ ์—†์Šต๋‹ˆ๋‹ค. PIXI ์ถ”์ถœ API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//if you want canvas
var canvas =renderer.extract.canvas(stage);
//if you want base64
var base64=renderer.extract.base64(stage);

var base64=renderer.extract.base64(๋‹จ๊ณ„); ๋ฐ var ์บ”๋ฒ„์Šค =renderer.extract.canvas(stage); ๊ฑฐ๊พธ๋กœ ๋œ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€๋งŒ ์บ”๋ฒ„์Šค์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ๋ฐฐ๊ฒฝ์ƒ‰์ด ์ง€์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ œ์•ˆ

์ด๋ฏธ์ง€ ํฌ๊ธฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” PIXI.RenderTexture๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ฐฐ๊ฒฝ์ƒ‰์ด ์—ฌ์ „ํžˆ ๊ณ ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” ๋‹ซํžŒ ํ›„ ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

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