{"id":16514,"date":"2025-12-23T16:21:39","date_gmt":"2025-12-23T07:21:39","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=16514"},"modified":"2025-12-23T18:46:19","modified_gmt":"2025-12-23T09:46:19","slug":"webgl-%eb%b0%a9%ec%8b%9d%ec%9d%98-%ea%b3%a0%ec%a0%84-gpgpu-three-js","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=16514","title":{"rendered":"WebGL \ubc29\uc2dd\uc758 \uace0\uc804 GPGPU (three.js)"},"content":{"rendered":"<p>\uc774\uc81c\ub294 WebGPU\ub85c \uc778\ud574 \uace0\uc804\uc774 \ub418\uc5b4\ubc84\ub9b0 three.js\uc5d0\uc11c\uc758 WebGL\uc5d0\uc11c\uc758 GPGPU \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \ucf54\ub4dc\ub97c \uc815\ub9ac\ud55c\ub2e4. \uace0\uc804\uc774\uae34 \ud558\uc9c0\ub9cc \uc544\uc9c1 \uc6f9 3D\ub294 WebGL\uc774 \ub300\uc138\uc774\ub2c8&#8230; \ud314\ud314\ud55c \ub178\ub545\uc758 \uc800\ub825\uc778 FBO(Frame Buffer Object) \uae30\ubc18\uc73c\ub85c GPGPU \ucf54\ub4dc\ub97c \uc815\ub9ac\ud574 \ubcf4\uba74\uc11c \ucd94\ud6c4 \ub2e4\uc2dc \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ud560(\uc77c\uc774 \uc788\uc744\ub798\ub098 \uc2f6\uae30\ub3c4\ud558\uc9c0\ub9cc) \uc77c\uc744 \ub300\ube44\ud574 \uc815\ub9ac\ud574 \ub454\ub2e4.<\/p>\n<p><P>FBO \uae30\ubc18\uc758 GPGPU \ud504\ub85c\uadf8\ub798\ubc0d\uc740 \uadf8 \ub0b4\ubd80 \ud750\ub984\uc774 \uc5b4\uc0c9\ud558\uace0 \ub2e4\uc18c \ubcf5\uc7a1\ud558\ub2e4. WebGL\uc740 \uadf8\ub798\ud53d API\ub85c \uc124\uacc4\ub41c\uc9c0\ub77c GPGPU\uc640 \uac19\uc740 \uc624\uc9c1 \uacc4\uc0b0(Computing)\uc744 \uace0\ub824\ud558\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc774\ub2e4. \uadf8 \ubcf5\uc7a1\ud568\uc5d0 \ub300\ud55c \uc124\uba85\uc740 \uc0dd\ub7b5\ud558\uace0&#8230;. three.js\ub294 \uadf8 \ubcf5\uc7a1\ud55c FBO \uae30\ubc18\uc758 GPGPU\ub97c \uc880\ub354 \uc27d\uac8c \ud65c\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d GPUComputationRenderer \ud074\ub798\uc2a4\ub97c AddOn\uc73c\ub85c \uc81c\uacf5\ud55c\ub2e4. (\ucc38\uace0\ub85c WebGPU\ub294 GPGPU\uc5d0 \ub300\ud55c \ucf54\ub4dc\uac00 \ub9e4\uc6b0 \uc790\uc5f0\uc2a4\ub7fd\ub2e4)<\/P><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\nimport { GPUComputationRenderer } from 'three\/addons\/misc\/GPUComputationRenderer.js'\r\n<\/pre>\n<p>GPUComputationRenderer \uac1d\uccb4\ub97c \uc0dd\uc131\ud574 \uc6d0\ud558\ub294 \ub370\uc774\ud130\uc758 \uc77d\uace0 \uc4f0\uae30\ub97c \ubaa8\ub450 GPU\ub97c \ud1b5\ud574 \uc218\ud589\ud560 \uc218 \uc788\ub2e4. \uc774 \uac1d\uccb4\uc758 \uc0dd\uc131 \ucf54\ub4dc \uc608\uc2dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\nconst baseGeometry = {}\r\nbaseGeometry.instance = new THREE.SphereGeometry(3)\r\nbaseGeometry.count = baseGeometry.instance.attributes.position.count\r\n\r\nconst gpgpu = {}\r\ngpgpu.size = Math.ceil(Math.sqrt(baseGeometry.count))\r\ngpgpu.computation = new GPUComputationRenderer(gpgpu.size, gpgpu.size, renderer)\r\n<\/pre>\n<p>WebGL\uc5d0\uc11c\uc758 GPGPU\ub294 \ud14d\uc2a4\uccd0(\uc815\ud655\ud788\ub294 THREE.DataTexture)\ub97c \uc774\uc6a9\ud55c\ub2e4. \uadf8\ub7ec\uae30\uc5d0 \ud14d\uc2a4\uccd0\uc758 \ud06c\uae30\ub97c \uc815\ud574\uc57c \ud558\ub294\ub370, \uc704\uc758 \ucf54\ub4dc\ub294 baseGeometry.instance\uc5d0 \uc800\uc7a5\ub41c \uc9c0\uc624\uba54\ud2b8\ub9ac\uc758 \uc815\uc810\ub4e4\uc5d0 \ub300\ud55c \uc88c\ud45c\uac12\ub4e4\uc744 \ud14d\uc2a4\uccd0\uc758 \ud53d\uc140\uc5d0 \uc778\ucf54\ub529(\ub9f5\ud551) \uc2dc\ud0a4\uace0 \uc788\ub2e4. GPGPU\uc758 \ud14d\uc2a4\uccd0\ub97c \uad6c\uc131\ud558\ub294 \uac01 \ud53d\uc140\uc740 R, G, B, A\ub85c \uac01\uac01\uc740 Float \ud0c0\uc785\uc774\ub2e4. \uc989, GPGPU\uc758 \ud14d\uc2a4\uccd0\ub97c \uad6c\uc131\ud558\ub294 \ud53d\uc140 \ud558\ub098 \ub2f9 \ucd1d 4\uac1c\uc758 \ub370\uc774\ud130 \ud0c0\uc785\uc744 \uc785\ub825\ud560 \uc218 \uc788\ub2e4. GLSL\uc5d0\uc11c R, G, B, A\ub294 \uac01\uac01 X, Y, Z, W\uc640 \uadf8 \uc774\ub984\uc774 \uac19\ub2e4. \uc704\uc758 \ucf54\ub4dc\ub294 \uc544\uc9c1 FBO\uc5d0 \ud574\ub2f9\ud558\ub294 \ub370\uc774\ud130 \ud14d\uc2a4\uccd0\ub97c \uc0dd\uc131\ud558\uae30 \uc804\uc774\ub2e4. \ub370\uc774\ud130 \ud14d\uc2a4\uccd0\ub97c \uc0dd\uc131\ud558\ub294 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\nconst baseParticlesTexture = gpgpu.computation.createTexture()\r\n<\/pre>\n<p>\uc774\ub807\uac8c \ub9cc\ub4e0 \ub370\uc774\ud130 \ud14d\uc2a4\uccd0\uc758 \uad6c\uc131 \ud53d\uc140 \ud558\ub098 \ud558\ub098\uc5d0 \uc9c0\uc624\uba54\ud2b8\ub9ac\uc758 \uad6c\uc131 \uc815\uc810\uc758 \uc88c\ud45c\ub97c \uc800\uc7a5\ud558\ub294 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\nfor (let i = 0; i < baseGeometry.count; i++) {\r\n    const i3 = i * 3\r\n    const i4 = i * 4\r\n\r\n    baseParticlesTexture.image.data[i4 + 0] = baseGeometry.instance.attributes.position.array[i3 + 0]\r\n    baseParticlesTexture.image.data[i4 + 1] = baseGeometry.instance.attributes.position.array[i3 + 1]\r\n    baseParticlesTexture.image.data[i4 + 2] = baseGeometry.instance.attributes.position.array[i3 + 2]\r\n    baseParticlesTexture.image.data[i4 + 3] = 0\r\n}\r\n<\/pre>\n<p>\uc704\uc758 \ucf54\ub4dc\ub294 \ub370\uc774\ud130 \ud14d\uc2a4\uccd0\uc758 \uac12\uc5d0 \ub300\ud55c \ucd08\uae30\ud654 \ucf54\ub4dc\uc5d0 \ud574\ub2f9\ud55c\ub2e4. GPU \uc5f0\uc0b0\uc5d0 \ube44\ud574 \ub290\ub824\ud130\uc9c4 CPU \ucf54\ub4dc\ub97c \ud1b5\ud574 \uc774\ub7f0 \ucd08\uae30\ud654 \ucf54\ub4dc\ub294 \ud55c\ubc88\ucbe4\uc740 \ud544\uc694\ud558\ub2e4.<\/p>\n<p>\ub370\uc774\ud130 \ud14d\uc2a4\uccd0, \uc989 FBO\uc758 \uac12\uc744 \uc77d\uace0 \uc4f0\ub294 \uc5f0\uc0b0\uc744 GPU\uc5d0\uc11c \ucc98\ub9ac\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc250\uc774\ub354 \ucf54\ub4dc\uac00 \ud544\uc694\ud558\ub2e4. \uc815\ud655\ud788\ub294 Fragment \uc250\uc774\ub354\uc774\uace0 \ud14d\uc2a4\uccd0\ub97c \ud574\ub2f9 \uc250\uc774\ub354\ub85c \uc804\ub2ec\ud558\uae30 \uc704\ud574 uniforms \ubc29\uc2dd\uc774 \uc0ac\uc6a9\ub41c\ub2e4. uniforms\uc73c\ub85c \uc804\ub2ec\ub420 \uac1d\uccb4 \uc774\ub984\uc744 \uc815\uc758\ud558\ub294 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\ngpgpu.particlesVariable = gpgpu.computation.addVariable('uParticles', gpgpuParticlesShader, baseParticlesTexture)\r\ngpgpu.computation.setVariableDependencies(gpgpu.particlesVariable, [gpgpu.particlesVariable])\r\n<\/pre>\n<p>\uc989 uParticles\ub77c\ub294 \uc774\ub984\uc758 uniforms \uc774\ub984\uc73c\ub85c baseParticlesTexture \ud14d\uc2a4\uccd0\ub97c gpgpuParticlesShader\ub77c\ub294 \uc250\uc774\ub354\ub85c \uc804\ub2ec\ud55c\ub2e4\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>gpgpuParticlesShader\ub294 \ubb38\uc790\uc5f4\uc774\ub2e4. \uc989 \uc250\uc774\ub354 \ucf54\ub4dc\uc774\uace0 \uc544\ub798\uc758 \uc608\uc2dc\uc640 \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"glsl\">\r\nvoid main()\r\n{\r\n  vec2 uv = gl_FragCoord.xy\/resolution.xy;\r\n\r\n  vec4 particle = texture(uParticles, uv);\r\n  particle.y += 0.01;\r\n  \r\n  gl_FragColor = particle;\r\n}\r\n<\/pre>\n<p>uv\ub97c \ud1b5\ud574 \ud14d\uc2a4\uccd0\uc758 \uac01 \ud53d\uc140\uc5d0 \uc811\uadfc\ud558\uae30 \uc704\ud55c \uc88c\ud45c\ub97c \uc815\uc758\ud558\uace0, \ud574\ub2f9 uv\uc5d0 \ub300\ud55c \ub370\uc774\ud130 \ud14d\uc2a4\uccd0(uParticles Uniforms\ub85c \uc9c0\uc815)\uc5d0\uc11c \ud53d\uc140\uac12\uc744 \uc77d\ub294\ub2e4. \uc774\ub807\uac8c \uc77d\uc740 \ud53d\uc140\uac12\uc740 vec4\uc774\uba70 \uac01\uac01 r,g,b,a \ub610\ub294 x,y,z,w\ub85c \uc77d\uc744 \uc218 \uc788\ub2e4. \ud574\ub2f9 \uac12\uc740 \ubcc0\uacbd\ud560 \uc218 \uc788\ub294\ub370.... \ubcc0\uacbd\ud588\ub2e4\uba74 gl_FragColor\ub97c \ud1b5\ud574 \ubcc0\uacbd\ub41c \uac12\uc744 \uc800\uc7a5\ud558\uba74 \uc2e4\uc81c\ub85c \ubcc0\uacbd\ub41c \uac12\uc774 \ub370\uc774\ud130 \ud14d\uc2a4\uccd0\uc758 \ud574\ub2f9 \uc704\uce58(uv)\uc5d0 \ub9de\uac8c \uc800\uc7a5\ub41c\ub2e4.<\/p>\n<p>\uc774\uac8c three.js\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 WebGL \ubc29\uc2dd\uc758 GPGPU \ud575\uc2ec \ucf54\ub4dc\uc774\ub2e4.<\/p>\n<p>\uc544! \uc9c0\uae08\uae4c\uc9c0 \ucf54\ub4dc\ub97c \uc791\uc131\ud588\uace0 \uc2e4\uc81c \uc14b\uc5c5\uc758 \uc644\uc131\uc744 \uc704\ud55c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\ngpgpu.computation.init()\r\n<\/pre>\n<p>\uadf8\ub7fc... \uc774\ub807\uac8c \ub9cc\ub4e0 FBO\ub97c \ub2e4\ub978 \uc7ac\uc9c8\uc758 \uc250\uc774\ub354\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcfc \ucc28\ub840\uc774\ub2e4. \uc774\ub97c \uc704\ud574\uc11c\ub294 \uba3c\uc800 FBO\uc758 \uac01 \ud53d\uc140\uc744 \ucc38\uc870\ud558\uae30 \uc704\ud55c \uc778\ub371\uc2a4\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\nconst particles = {}\r\n\r\nconst particlesUvArray = new Float32Array(baseGeometry.count * 2)\r\n\r\nfor (let y = 0; y < gpgpu.size; y++) {\r\n    for (let x = 0; x < gpgpu.size; x++) {\r\n        const i = (y * gpgpu.size + x)\r\n        const i2 = i * 2\r\n        const uvX = (x + .5) \/ gpgpu.size\r\n        const uvY = (y + .5) \/ gpgpu.size\r\n        particlesUvArray[i2 + 0] = uvX;\r\n        particlesUvArray[i2 + 1] = uvY;\r\n    }\r\n}\r\n\r\nparticles.geometry.setAttribute('aParticlesUv', new THREE.BufferAttribute(particlesUvArray, 2))\r\n<\/pre>\n<p>\uc7ac\uc9c8\uc5d0 \ub300\ud55c FBO\uc758 \uad00\uacc4 \uc124\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\nparticles.material = new THREE.ShaderMaterial({\r\n    vertexShader: particlesVertexShader,\r\n    fragmentShader: particlesFragmentShader,\r\n    uniforms:\r\n    {\r\n        uSize: new THREE.Uniform(0.07),\r\n        uResolution: new THREE.Uniform(new THREE.Vector2(sizes.width * sizes.pixelRatio, sizes.height * sizes.pixelRatio)),\r\n        uParticlesTexture: new THREE.Uniform()\r\n    },\r\n    transparent: true,\r\n    depthWrite: false,\r\n})\r\n<\/pre>\n<p>\uc704\uc758 \ucf54\ub4dc\ub97c \ubcf4\uba74 uParticlesTexture\uc774\ub77c\ub294 Uniform\uc774 \ubcf4\uc774\ub294\ub370, \uc774 Uniform \uac1d\uccb4\uc5d0 FBO\ub97c \uc5f0\uacb0\ud55c\ub2e4. \ud574\ub2f9 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\nconst tick = () => {\r\n    gpgpu.computation.compute()\r\n    particles.material.uniforms.uParticlesTexture.value = gpgpu.computation.getCurrentRenderTarget(gpgpu.particlesVariable).texture\r\n}\r\n<\/pre>\n<p>tick\ub294 \ud504\ub798\uc784 \ub80c\ub354\ub9c1\ub9c8\ub2e4 \ud638\ucd9c\ub418\ub294 \ud568\uc218\uc778\ub370, \uba3c\uc800 GPGPU \uc5f0\uc0b0\uc744 \ud1b5\ud574 FBO\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uace0 FBO\uc5d0 \uc5f0\uacb0\ub41c \uc7ac\uc9c8\uc758 uniform \uac1d\uccb4\uc5d0 FBO\uc758 \ud14d\uc2a4\uccd0\ub97c \uc124\uc815\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>\ucc38\uace0\ub85c FBO\ub97c \uc0ac\uc6a9\ud558\ub294, \uc989 \uc5f0\uacb0\ub41c \uc7ac\uc9c8\uc5d0 \ub300\ud55c Vertex \uc250\uc774\ub354 \ucf54\ub4dc\uc758 \uc608\uc2dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \uc774 \ucf54\ub4dc\ub97c \ud1b5\ud574 FBO\uac00 \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ub418\ub294\uc9c0\ub97c \uc5ff\ubcfc \uc218 \uc788\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"glsl\">\r\n...\r\n\r\nuniform sampler2D uParticlesTexture;\r\nattribute vec2 aParticlesUv;\r\n\r\nvoid main()\r\n{\r\n    vec4 particle = texture(uParticlesTexture, aParticlesUv);\r\n\r\n    vec4 modelPosition = modelMatrix * vec4(particle.xyz, 1.0);\r\n    vec4 viewPosition = viewMatrix * modelPosition;\r\n    vec4 projectedPosition = projectionMatrix * viewPosition;\r\n    gl_Position = projectedPosition;\r\n\r\n    ...\r\n}\r\n<\/pre>\n<p>\ub05d\uc73c\ub85c FBO\ub97c \uc5c5\ub370\uc774\ud2b8 \ud574\uc8fc\ub294 \uc250\uc774\ub354\uc5d0\ub3c4 unforms \uac1c\ub150\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud560 \uc218 \uc788\ub2e4. uniforms \uac1c\ub150 \ud615\ud0dc\ub85c \uc804\ub2ec\ud558\ub824\uba74 \uc7ac\uc9c8\uc744 \ucc38\uc870\ud574\uc57c \ud558\ub294\ub370 FBO\uc758 \ud574\ub2f9 \uc7ac\uc9c8\uc740 \ub2e4\uc74c\ucc98\ub7fc \uc811\uadfc\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\ngpgpu.particlesVariable.material.uniforms.uTime = new THREE.Uniform(0)\r\n<\/pre>\n<p>\uc774\uc81c \uc815\ub9d0 \ub05d.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc774\uc81c\ub294 WebGPU\ub85c \uc778\ud574 \uace0\uc804\uc774 \ub418\uc5b4\ubc84\ub9b0 three.js\uc5d0\uc11c\uc758 WebGL\uc5d0\uc11c\uc758 GPGPU \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud55c \ucf54\ub4dc\ub97c \uc815\ub9ac\ud55c\ub2e4. \uace0\uc804\uc774\uae34 \ud558\uc9c0\ub9cc \uc544\uc9c1 \uc6f9 3D\ub294 WebGL\uc774 \ub300\uc138\uc774\ub2c8&#8230; \ud314\ud314\ud55c \ub178\ub545\uc758 \uc800\ub825\uc778 FBO(Frame Buffer Object) \uae30\ubc18\uc73c\ub85c GPGPU \ucf54\ub4dc\ub97c \uc815\ub9ac\ud574 \ubcf4\uba74\uc11c \ucd94\ud6c4 \ub2e4\uc2dc \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ud560(\uc77c\uc774 \uc788\uc744\ub798\ub098 \uc2f6\uae30\ub3c4\ud558\uc9c0\ub9cc) \uc77c\uc744 \ub300\ube44\ud574 \uc815\ub9ac\ud574 \ub454\ub2e4. FBO \uae30\ubc18\uc758 GPGPU \ud504\ub85c\uadf8\ub798\ubc0d\uc740 \uadf8 \ub0b4\ubd80 \ud750\ub984\uc774 \uc5b4\uc0c9\ud558\uace0 \ub2e4\uc18c \ubcf5\uc7a1\ud558\ub2e4. WebGL\uc740 \uadf8\ub798\ud53d API\ub85c \uc124\uacc4\ub41c\uc9c0\ub77c GPGPU\uc640 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=16514\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;WebGL \ubc29\uc2dd\uc758 \uace0\uc804 GPGPU (three.js)&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153,145,139],"tags":[],"class_list":["post-16514","post","type-post","status-publish","format-standard","hentry","category-shader","category-three-js","category-webgl"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/16514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=16514"}],"version-history":[{"count":9,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/16514\/revisions"}],"predecessor-version":[{"id":16526,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/16514\/revisions\/16526"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16514"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}