Pixi.js: PIXI๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์…ฐ์ด๋” ์ฝ”๋“œ์—์„œ ํ•„ํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•จ

์— ๋งŒ๋“  2017๋…„ 11์›” 22์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pixijs/pixi.js

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

VertexArrayObject.js:171 Uncaught TypeError: Cannot read property 'location' of undefined
    at VertexArrayObject.addAttribute (VM1006 pixi.js:2348)
    at Quad.initVao (VM1006 pixi.js:19874)
    at FilterManager.applyFilter (VM1006 pixi.js:18947)
    at Filter.apply (VM1006 pixi.js:18420)
    at FilterManager.popFilter (VM1006 pixi.js:18877)
    at Container.renderAdvancedWebGL (VM1006 pixi.js:9423)
    at Container.renderWebGL (VM1006 pixi.js:9360)
    at Container.renderWebGL (VM1006 pixi.js:9366)
    at WebGLRenderer.render (VM1006 pixi.js:17563)
    at Application.render (VM1006 pixi.js:8043)

๊ณต์‹ ์˜ˆ์ œ๋„ ์ด ๋ฒ„๊ทธ๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
http://pixijs.io/examples/#/filters/filter -mouse.js

์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” glslify๊ฐ€ pixi๊ฐ€ ์—ฌ์ „ํžˆ ์•ก์„ธ์Šค๋ฅผ ์‹œ๋„ํ•˜๋Š” ์ผ๋ถ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์œ ๋‹ˆํผ์„ ์ œ๊ฑฐํ•œ ์ผ๋ถ€ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์œ ๋‹ˆํผ ์—†์ด ์™„์ „ํžˆ ์ •์ ์ธ fragShader์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0)

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

์˜ˆ์ œ๋Š” ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

Google ํฌ๋กฌ ๋ฒ„์ „ 62.0.3202.94(๊ณต์‹ ๋นŒ๋“œ)(64๋น„ํŠธ)
2017-11-23-143829_667x172_scrot

Firefox Quantum 57.0(64๋น„ํŠธ)
2017-11-23-143957_741x236_scrot

OS: ์šฐ๋ถ„ํˆฌ 17.10 ๊ต๋ฌ˜ํ•œ

@dobi ์ข‹์€ ์บ์น˜! ๋„ค, ์ตœ์ ํ™”๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์ œ๊ฑฐํ–ˆ๋Š”๋ฐ(์ƒ˜ํ”Œ๋Ÿฌ์— ๊ฑธ๋ฆผ๋Œ) ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์ƒ˜ํ”Œ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•„ํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์‹ญ๋‹ˆ๊นŒ? ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” https://github.com/pixijs/pixi-plugin-example ๊ณผ ๊ฐ™์€ ๋ Œ๋”๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?

์˜ค๋Š˜ ๋‘ ๋ฒˆ์งธ๋กœ v4์— ์…ฐ์ด๋”์™€ ํ•„ํ„ฐ๊ฐ€ ์—‰๋ง์ด ๋œ ์  ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. v5์—์„œ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ, ๋‚˜๋Š” ์•„์ง ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒ๊ณ  ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์š”์ „์— ๊ทธ ๊ธฐ๋Šฅ์„ ์‹คํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํžŒํŠธ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

v5์— ๋Œ€ํ•œ ETA๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๊นŒ?

2๊ฐœ์›” ์ •๋„ :)

ํ•„ํ„ฐ์— ๋Œ€ํ•œ ๋งŽ์€ ํŠธ๋ฆญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๊ทธ ๊ธฐ์‚ฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค: https://github.com/pixijs/pixi.js/wiki/v4-Creating-Filters

@ivanpopelyshev ํŠœํ† ๋ฆฌ์–ผ์— ๋”ฐ๋ผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ €๋Š” pixi.js์— ์ •๋ง ํ•ดํ‚ค ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์ €์—๊ฒŒ ์ ํ•ฉํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

diff --git a/js/pixi.js b/js/pixi.js
index 363f09c..d0a321b 100644
--- a/js/pixi.js
+++ b/js/pixi.js
@@ -2344,6 +2344,9 @@ VertexArrayObject.prototype.activate = function()
  */
 VertexArrayObject.prototype.addAttribute = function(buffer, attribute, type, normalized, stride, start)
 {
+  if (!attribute) {
+    return this;
+  }
     this.attributes.push({
         buffer:     buffer,
         attribute:  attribute,

์ด๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ v5๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ v4์˜ ์…ฐ์ด๋” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์•„๋งˆ๋„ ๋” ๋‚˜์€ ์ˆ˜์ •์œผ๋กœ) :)

์ข‹์€ ํ•ดํ‚น์ด์•ผ!

๋ณ„๋„์˜ js ํŒŒ์ผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PIXI.glCore.VertexArrayObject.prototype.addAttribute = ...

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€์žˆ๋‹ค. ๋˜ํ•œ Ubuntu 17.10 artful. ์…ฐ์ด๋”๋Š” Pixi.js์—์„œ ์ „ํ˜€ ์•ˆ์ •์ ์ž…๋‹ˆ๊นŒ? ํ”„๋กœ๋•์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ”ฝ์…€ ์…ฐ์ด๋”๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

ํ•„ํ„ฐ๋กœ ๋˜๋Š” ๋ Œ๋”๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ. ๊ทธ๋“ค์€ ์•ˆ์ •์ ์ด์ง€๋งŒ webgl๊ณผ pixi ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ง„์ง€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/pixijs/pixi.js/wiki/v4-Creating-Filters
https://github.com/pixijs/pixi-plugin-example/

N ๋ฒˆ์งธ๋กœ ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ v5์—์„œ ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

const filterCode = `void main(){
   gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}`;
const filter = new PIXI.Filter(null, filterCode);
someSprite.filters = [filter];

์ด ๋งŽ์€ ์ฝ”๋“œ๋กœ ์ธํ•ด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ์˜ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? ์•„๋‹ˆ๋ฉด null์„ ๋ฌด์–ธ๊ฐ€๋กœ ๋Œ€์ฒดํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

ํ•„ํ„ฐ์˜ ๊ฒฝ์šฐ ํ…์Šค์ฒ˜ ์ขŒํ‘œ์™€ ์ƒ˜ํ”Œ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด FilterManager๊ฐ€ ์†์„ฑ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋ Œ๋”๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์—๋Š” ํ•ด๋‹น ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์˜ˆ, ํฐ ์ƒ์šฉ๊ตฌ์ž…๋‹ˆ๋‹ค.

์‹œ๋„ํ•ด๋ณด์‹ญ์‹œ์˜ค: https://github.com/TazOen/createShaderPlugin . ๊ทธ๋Ÿฌ๋‚˜ ํ…์Šค์ฒ˜๋ฅผ ๋ฌด์‹œํ•˜๊ณ  bindTexture ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ „์ฒด pixi-plugin-example์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

ํ…์Šค์ฒ˜ ์ขŒํ‘œ์™€ "์ƒ˜ํ”Œ๋Ÿฌ"๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ์ธ๊ฐ€ ์ƒ˜ํ”Œ๋Ÿฌ์ธ๊ฐ€? ์˜คํƒ€?
๋‚˜๋Š” ์˜ˆ์ œ์˜ ๋„์›€์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•˜์ง€๋งŒ. ์ด ํŽ˜์ด์ง€์—์„œ ์ด๋Ÿฌํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
http://pixijs.io/examples/#/basics/custom -filter.js

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

๋•๋ถ„์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค :) https://github.com/pixijs/pixi.js/wiki/v4-Creating-Filters#cannot -read-property-location-of-undefined

์•„, ๊ทธ๋žฌ๊ตฌ๋‚˜. ์œ„ํ‚ค๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค.

๋•๋ถ„์— ๋˜๋„ค์š”

๋ฐฉ๊ธˆ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•„ํ„ฐ ๋งˆ์šฐ์Šค ๋ฐ๋ชจ์— ์•Œ๋ฆผ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. v4์—์„œ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” v5์—์„œ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

FilterManager์— ํ•„์š”ํ•œ ์†์„ฑ ์ค‘ ์ผ๋ถ€๊ฐ€ ์…ฐ์ด๋”์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ์— ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

aTextureCoord -> vTextureCoord ์†์„ฑ๋งŒ

์ด๊ฒƒ์€ ๋งค์šฐ ์ด์ƒํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ฝ”๋“œ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

varying vec2 vTextureCoord;
varying vec4 vColor;

uniform sampler2D uSampler;
uniform vec4 uTextureClamp;
uniform vec4 uColor;

void main(void)
{
    gl_FragColor = texture2D(uSampler, vTextureCoord);
    gl_FragColor.r = 0.0;
    gl_FragColor.g = 0.0;
    gl_FragColor.b = 0.0;
}

ํ•˜์ง€๋งŒ gl_FragColor.a = 0.0; ๋ฅผ ๋์— ์ถ”๊ฐ€ํ•˜๋ฉด Cannot read property 'location' of undefined ๋ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ 4๊ฐœ ์ค‘ 3๊ฐœ๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ญ”๊ฐ€์š”? ๋ญ๊ฐ€ ์ž˜๋ชป ๋˜์—ˆ ๋‹ˆ?

@germansokolov13 ์ด ํ–‰๋™์€ ์™„์ „ํžˆ ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐ ํ•ด๋ณด์„ธ์š”:
์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด ์˜ค๋ฅ˜๋Š” glsify๊ฐ€ ์…ฐ์ด๋” ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์ถ”๊ฐ€ํ•˜๋ฉด gl_FragColor.a = 0.0; ๊ฐ€์— ์ „ํ™”๋ฅผ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค texture2D ๊ฐ€ ์™„์ „ํžˆ ๋ฎ์–ด ์“ฐ๊ธฐ๋ฉ๋‹ˆ๋‹ค ์›์ธ,ํ•˜์ง€๋งŒ ๋•Œ๊นŒ์ง€์—์„œ ์•ŒํŒŒ ์ฑ„๋„์„ ์†Œ์š” texture2D

glsify๊ฐ€ texture2D์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์ตœ์ ํ™”ํ•˜๋ฉด webgl์€ uSampler ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ pixi๊ฐ€ ํ•ด๋‹น ์œ ๋‹ˆํผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ๊ณต๊ฐ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • (์ง€๊ธˆ์€) ๋‚ด๊ฐ€ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ•ดํ‚น์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— ์†์„ฑ์ด ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • uSampler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ glsify๊ฐ€ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜๋Š” v5๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ž˜ ์žก์•˜์Šต๋‹ˆ๋‹ค, @doebi!

๋˜๋Š” ๋ Œ๋”๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์˜ค, ์ด์ œ ์•Œ์•˜๋‹ค! Pixi.js์˜ ๋‹ค์Œ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค์— Doebi์˜ ํŒจ์น˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ• ๊นŒ์š”? PR์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋‚˜์š”?

์˜ˆ, ํ™๋ณดํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

https://github.com/pixijs/pixi.js/blob/dev/src/core/renderers/webgl/utils/Quad.js#L93
https://github.com/pixijs/pixi.js/blob/dev/src/core/renderers/webgl/managers/FilterManager.js#L242

๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ  FilterManager์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ถ”๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

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

ํ…Œ์ŠคํŠธํ•œ ํ•œ Windows, MacOS ๋ฐ Android์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ iOS์—์„œ๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ์…ฐ์ด๋” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
๊ผญ์ง€์ :

attribute vec2 aVertexPosition;
attribute vec2 aTextureCoord;
uniform float strength;
uniform mat3 projectionMatrix;
varying vec2 vBlurTexCoords[15];
void main(void){
   gl_Position = vec4((projectionMatrix * vec3((aVertexPosition), 1.0)).xy, 0.0, 1.0);
   vBlurTexCoords[0] = aTextureCoord + vec2(0.0, -7.0 * strength);
   vBlurTexCoords[1] = aTextureCoord + vec2(0.0, -6.0 * strength);
   vBlurTexCoords[2] = aTextureCoord + vec2(0.0, -5.0 * strength);
   vBlurTexCoords[3] = aTextureCoord + vec2(0.0, -4.0 * strength);
   vBlurTexCoords[4] = aTextureCoord + vec2(0.0, -3.0 * strength);
   vBlurTexCoords[5] = aTextureCoord + vec2(0.0, -2.0 * strength);
   vBlurTexCoords[6] = aTextureCoord + vec2(0.0, -1.0 * strength);
   vBlurTexCoords[7] = aTextureCoord + vec2(0.0, 0.0 * strength);
   vBlurTexCoords[8] = aTextureCoord + vec2(0.0, 1.0 * strength);
   vBlurTexCoords[9] = aTextureCoord + vec2(0.0, 2.0 * strength);
   vBlurTexCoords[10] = aTextureCoord + vec2(0.0, 3.0 * strength);
   vBlurTexCoords[11] = aTextureCoord + vec2(0.0, 4.0 * strength);
   vBlurTexCoords[12] = aTextureCoord + vec2(0.0, 5.0 * strength);
   vBlurTexCoords[13] = aTextureCoord + vec2(0.0, 6.0 * strength);
   vBlurTexCoords[14] = aTextureCoord + vec2(0.0, 7.0 * strength);
}

ํŒŒํŽธ:

varying vec2 vBlurTexCoords[15];
uniform sampler2D uSampler;
void main(void){
   gl_FragColor = vec4(0.0);
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[0]) * 0.013068780984604511;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[1]) * 0.013907007172070673;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[2]) * 0.017439264394216315;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[3]) * 0.028762309061254498;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[4]) * 0.05603114255667656;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[5]) * 0.10421702583793174;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[6]) * 0.163461199220823;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[7]) * 0.2062265415448454;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[8]) * 0.163461199220823;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[9]) * 0.10421702583793174;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[10]) * 0.05603114255667656;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[11]) * 0.028762309061254498;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[12]) * 0.017439264394216315;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[13]) * 0.013907007172070673;
   gl_FragColor += texture2D(uSampler, vBlurTexCoords[14]) * 0.013068780984604511;
}

๋น„๊ต๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๊ธฐ๋ณธ BlurYFilter์˜ ์…ฐ์ด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ดˆ๋ก:

attribute vec2 aVertexPosition;
attribute vec2 aTextureCoord;
uniform float strength;
uniform mat3 projectionMatrix;
varying vec2 vBlurTexCoords[5];
void main(void)
{
  gl_Position = vec4((projectionMatrix * vec3((aVertexPosition), 1.0)).xy, 0.0, 1.0);
  vBlurTexCoords[0] = aTextureCoord + vec2(0.0, -2.0 * strength);
  vBlurTexCoords[1] = aTextureCoord + vec2(0.0, -1.0 * strength);
  vBlurTexCoords[2] = aTextureCoord + vec2(0.0, 0.0 * strength);
  vBlurTexCoords[3] = aTextureCoord + vec2(0.0, 1.0 * strength);
  vBlurTexCoords[4] = aTextureCoord + vec2(0.0, 2.0 * strength);

}

ํŒŒํŽธ:

varying vec2 vBlurTexCoords[5];
uniform sampler2D uSampler;
void main(void)
{
    gl_FragColor = vec4(0.0);
    gl_FragColor += texture2D(uSampler, vBlurTexCoords[0]) * 0.153388;
    gl_FragColor += texture2D(uSampler, vBlurTexCoords[1]) * 0.221461;
    gl_FragColor += texture2D(uSampler, vBlurTexCoords[2]) * 0.250301;
    gl_FragColor += texture2D(uSampler, vBlurTexCoords[3]) * 0.221461;
    gl_FragColor += texture2D(uSampler, vBlurTexCoords[4]) * 0.153388;

}

์™œ ์ด๊ฒƒ์ด ์ž˜๋ชป๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@tyleet ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ํ™•์‹คํ•ฉ๋‹ˆ๊นŒ? ์ฝ˜์†”์— ๋ฌด์—‡์ด ๋ณด์ด๋‚˜์š”?

ํŽธ์ง‘ํ•˜๋‹ค:
์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š”. ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ปค๋„ ํฌ๊ธฐ 15๋Š” iOS์— ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ปค๋„ ํฌ๊ธฐ๋ฅผ 7๋กœ ์ค„์ด๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

<-----์›๋ณธ--------->
์•ˆ๋…•ํ•˜์„ธ์š”,
๋‹ต๋ณ€์ด ๋Šฆ์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ง์— ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์ค„์—์„œ ์‹คํŒจํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. "์†์„ฑ"์ด ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์›๊ฒฉ ์ฝ˜์†”์˜ ์Šคํฌ๋ฆฐ์ƒท์ž…๋‹ˆ๋‹ค.
image
image

@ivanpopelyshev ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋กœ ์›Œ๋ฐ์—…ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?
v5์—์„œ ์ˆ˜์ •๋  ๊ฒƒ์ด๋ผ๋Š” ์•ฝ์†์„ ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ๋ฌธ์ œ๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@doebi ๋‹ซ์Šต๋‹ˆ๋‹ค.

@tyleet ํ…์Šค์ฒ˜์—์„œ ๊ฐ€์ ธ์˜จ ์ƒ˜ํ”Œ ์ˆ˜๋Š” ์‹œ์Šคํ…œ๋งˆ๋‹ค ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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