λμ μ΄κ³ ν¨μ¨μ μΈ κ·Έλν½μ€ νλ‘κ·Έλλ°μ μν μ °μ΄λ μΈν°νμ΄μ€ μΈνΈλ‘μ€νμ κΈ°μ μ νꡬνλ WebGL μ °μ΄λ νλΌλ―Έν° 리νλ μ μ λν μ’ ν© κ°μ΄λμ λλ€.
WebGL μ °μ΄λ νλΌλ―Έν° 리νλ μ : μ °μ΄λ μΈν°νμ΄μ€ μΈνΈλ‘μ€νμ
WebGL λ° νλ κ·Έλν½μ€ νλ‘κ·Έλλ° μμμμ μ °μ΄λ 리νλ μ (shader reflection), λλ μ °μ΄λ μΈν°νμ΄μ€ μΈνΈλ‘μ€νμ (shader interface introspection)μ κ°λ°μκ° νλ‘κ·Έλλ° λ°©μμΌλ‘ μ °μ΄λ νλ‘κ·Έλ¨μ λν μ 보λ₯Ό 쿼리ν μ μκ² ν΄μ£Όλ κ°λ ₯ν κΈ°μ μ λλ€. μ΄ μ 보μλ μ λνΌ(uniform) λ³μ, μ΄νΈλ¦¬λ·°νΈ(attribute) λ³μ λ° κΈ°ν μ °μ΄λ μΈν°νμ΄μ€ μμμ μ΄λ¦, μ ν, μμΉ λ±μ΄ ν¬ν¨λ©λλ€. μ °μ΄λ 리νλ μ μ μ΄ν΄νκ³ νμ©νλ©΄ WebGL μ ν리μΌμ΄μ μ μ μ°μ±, μ μ§λ³΄μμ±, μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. μ΄ μ’ ν© κ°μ΄λμμλ μ °μ΄λ 리νλ μ μ 볡μ‘μ±μ κΉμ΄ νκ³ λ€μ΄ κ·Έ μ΄μ , ꡬν λ° μ€μ μ μ© μ¬λ‘λ₯Ό νꡬν©λλ€.
μ °μ΄λ 리νλ μ μ΄λ 무μμΈκ°?
ν΅μ¬μ μΌλ‘, μ °μ΄λ 리νλ μ μ μ»΄νμΌλ μ °μ΄λ νλ‘κ·Έλ¨μ λΆμνμ¬ κ·Έ μ λ ₯κ³Ό μΆλ ₯μ λν λ©νλ°μ΄ν°λ₯Ό μΆμΆνλ κ³Όμ μ λλ€. WebGLμμ μ °μ΄λλ GPU(κ·Έλν½ μ²λ¦¬ μ₯μΉ)λ₯Ό μν΄ νΉλ³ν μ€κ³λ Cμ μ μ¬ν μΈμ΄μΈ GLSL(OpenGL Shading Language)λ‘ μμ±λ©λλ€. GLSL μ °μ΄λκ° μ»΄νμΌλκ³ WebGL νλ‘κ·Έλ¨μ λ§ν¬λ λ, WebGL λ°νμμ λ€μκ³Ό κ°μ μ °μ΄λ μΈν°νμ΄μ€μ λν μ 보λ₯Ό μ μ₯ν©λλ€:
- μ λνΌ λ³μ(Uniform Variables): JavaScript μ½λμμ μμ ν μ μλ μ °μ΄λ λ΄μ μ μ λ³μμ λλ€. μ£Όλ‘ νλ ¬, ν μ€μ², μμ λ° κΈ°ν νλΌλ―Έν°λ₯Ό μ °μ΄λμ μ λ¬νλ λ° μ¬μ©λ©λλ€.
- μ΄νΈλ¦¬λ·°νΈ λ³μ(Attribute Variables): κ° μ μ (vertex)μ λν΄ μ μ μ °μ΄λλ‘ μ λ¬λλ μ λ ₯ λ³μμ λλ€. μΌλ°μ μΌλ‘ μ μ μμΉ, λ²μ (normal), ν μ€μ² μ’ν λ° κΈ°ν μ μ λ³ λ°μ΄ν°λ₯Ό λνλ λλ€.
- λ² μ΄λ§ λ³μ(Varying Variables): μ μ μ °μ΄λμμ νλκ·Έλ¨ΌνΈ μ °μ΄λλ‘ λ°μ΄ν°λ₯Ό μ λ¬νλ λ° μ¬μ©λλ λ³μμ λλ€. μ΄λ€μ λμ€ν°νλ ν리미ν°λΈμ κ±Έμ³ λ³΄κ°λ©λλ€.
- μ °μ΄λ μ€ν λ¦¬μ§ λ²νΌ κ°μ²΄(SSBOs): μ °μ΄λκ° μμμ λ°μ΄ν°λ₯Ό μ½κ³ μΈ μ μλ λ©λͺ¨λ¦¬ μμμ λλ€. (WebGL 2μμ λμ λ¨).
- μ λνΌ λ²νΌ κ°μ²΄(UBOs): SSBOμ μ μ¬νμ§λ§ μΌλ°μ μΌλ‘ μ½κΈ° μ μ© λ°μ΄ν°μ μ¬μ©λ©λλ€. (WebGL 2μμ λμ λ¨).
μ °μ΄λ 리νλ μ μ ν΅ν΄ μ°λ¦¬λ μ΄ μ 보λ₯Ό νλ‘κ·Έλλ° λ°©μμΌλ‘ κ²μν μ μμΌλ©°, μ΄ λ³μλ€μ μ΄λ¦, μ ν, μμΉλ₯Ό νλμ½λ©νμ§ μκ³ λ JavaScript μ½λκ° λ€λ₯Έ μ °μ΄λμ μλνλλ‘ μ‘°μ ν μ μμ΅λλ€. μ΄λ λμ μΌλ‘ λ‘λλ μ °μ΄λλ μ °μ΄λ λΌμ΄λΈλ¬λ¦¬λ‘ μμ ν λ νΉν μ μ©ν©λλ€.
μ μ °μ΄λ 리νλ μ μ μ¬μ©νλκ°?
μ °μ΄λ 리νλ μ μ λͺ κ°μ§ κ°λ ₯ν μ΄μ μ μ 곡ν©λλ€:
λμ μ °μ΄λ κ΄λ¦¬
ν¬κ±°λ 볡μ‘ν WebGL μ ν리μΌμ΄μ μ κ°λ°ν λ, μ¬μ©μ μ λ ₯, λ°μ΄ν° μꡬ μ¬ν λλ νλμ¨μ΄ κΈ°λ₯μ λ°λΌ μ °μ΄λλ₯Ό λμ μΌλ‘ λ‘λνκ³ μΆμ μ μμ΅λλ€. μ °μ΄λ 리νλ μ μ μ¬μ©νλ©΄ λ‘λλ μ °μ΄λλ₯Ό κ²μ¬νκ³ νμν μ λ ₯ νλΌλ―Έν°λ₯Ό μλμΌλ‘ ꡬμ±νμ¬ μ ν리μΌμ΄μ μ λ μ μ°νκ³ μ μμ± μκ² λ§λ€ μ μμ΅λλ€.
μμ: μ¬μ©μκ° λ€μν μ °μ΄λ μꡬ μ¬νμ κ°μ§ λ€λ₯Έ μ¬μ§(material)μ λ‘λν μ μλ 3D λͺ¨λΈλ§ μ ν리μΌμ΄μ μ μμν΄ λ³΄μΈμ. μ °μ΄λ 리νλ μ μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ κ° μ¬μ§μ μ °μ΄λμ νμν ν μ€μ², μμ λ° κΈ°ν νλΌλ―Έν°λ₯Ό κ²°μ νκ³ μ μ ν 리μμ€λ₯Ό μλμΌλ‘ λ°μΈλ©ν μ μμ΅λλ€.
μ½λ μ¬μ¬μ©μ± λ° μ μ§λ³΄μμ±
JavaScript μ½λλ₯Ό νΉμ μ °μ΄λ ꡬνμμ λΆλ¦¬ν¨μΌλ‘μ¨ μ °μ΄λ 리νλ μ μ μ½λ μ¬μ¬μ©κ³Ό μ μ§λ³΄μμ±μ μ΄μ§ν©λλ€. κ΄λ²μν μ °μ΄λμ μλνλ μΌλ°μ μΈ μ½λλ₯Ό μμ±ν μ μμ΄, μ °μ΄λλ³ μ½λ λΆκΈ°μ νμμ±μ μ€μ΄κ³ μ λ°μ΄νΈ λ° μμ μ λ¨μνν μ μμ΅λλ€.
μμ: μ¬λ¬ μ‘°λͺ λͺ¨λΈμ μ§μνλ λ λλ§ μμ§μ μκ°ν΄ λ΄ μλ€. κ° μ‘°λͺ λͺ¨λΈμ λν΄ λ³λμ μ½λλ₯Ό μμ±νλ λμ , μ °μ΄λ 리νλ μ μ μ¬μ©νμ¬ μ νλ μ‘°λͺ μ °μ΄λμ λ°λΌ μ μ ν μ‘°λͺ νλΌλ―Έν°(μ: μ‘°λͺ μμΉ, μμ, κ°λ)λ₯Ό μλμΌλ‘ λ°μΈλ©ν μ μμ΅λλ€.
μ€λ₯ λ°©μ§
μ °μ΄λ 리νλ μ μ μ °μ΄λμ μ λ ₯ νλΌλ―Έν°κ° μ 곡νλ λ°μ΄ν°μ μΌμΉνλμ§ νμΈν¨μΌλ‘μ¨ μ€λ₯λ₯Ό λ°©μ§νλ λ° λμμ΄ λ©λλ€. μ λνΌ λ° μ΄νΈλ¦¬λ·°νΈ λ³μμ λ°μ΄ν° μ νκ³Ό ν¬κΈ°λ₯Ό νμΈνκ³ λΆμΌμΉκ° μμ κ²½μ° κ²½κ³ λ μ€λ₯λ₯Ό λ°μμμΌ μκΈ°μΉ μμ λ λλ§ μν°ν©νΈλ μΆ©λμ λ°©μ§ν μ μμ΅λλ€.
μ΅μ ν
μ΄λ€ κ²½μ°μλ μ °μ΄λ 리νλ μ μ μ΅μ ν λͺ©μ μΌλ‘ μ¬μ©ν μ μμ΅λλ€. μ °μ΄λμ μΈν°νμ΄μ€λ₯Ό λΆμνμ¬ μ¬μ©λμ§ μλ μ λνΌ λ³μλ μ΄νΈλ¦¬λ·°νΈλ₯Ό μλ³νκ³ λΆνμν λ°μ΄ν°λ₯Ό GPUλ‘ λ³΄λ΄λ κ²μ νΌν μ μμ΅λλ€. μ΄λ νΉν μ μ¬μ μ₯μΉμμ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
WebGLμμ μ °μ΄λ 리νλ μ μ μ΄λ»κ² μλνλκ°
WebGLμλ λ€λ₯Έ κ·Έλν½ API(μ: OpenGLμ νλ‘κ·Έλ¨ μΈν°νμ΄μ€ 쿼리)μ²λΌ λ΄μ₯λ 리νλ μ APIκ° μμ΅λλ€. λ°λΌμ WebGLμμ μ °μ΄λ 리νλ μ μ ꡬννλ €λ©΄ μ£Όλ‘ GLSL μμ€ μ½λλ₯Ό νμ±νκ±°λ μ΄ λͺ©μ μ μν΄ μ€κ³λ μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©νλ κΈ°μ μ μ‘°ν©μ΄ νμν©λλ€.
GLSL μμ€ μ½λ νμ±
κ°μ₯ μ§μ μ μΈ μ κ·Ό λ°©μμ μ °μ΄λ νλ‘κ·Έλ¨μ GLSL μμ€ μ½λλ₯Ό νμ±νλ κ²μ λλ€. μ΄λ μ °μ΄λ μμ€λ₯Ό λ¬Έμμ΄λ‘ μ½μ λ€μ μ κ· ννμμ΄λ λ μ κ΅ν νμ± λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ λνΌ λ³μ, μ΄νΈλ¦¬λ·°νΈ λ³μ λ° κΈ°ν κ΄λ ¨ μ °μ΄λ μμμ λν μ 보λ₯Ό μλ³νκ³ μΆμΆνλ κ²μ ν¬ν¨ν©λλ€.
ν¬ν¨λ λ¨κ³:
- μ °μ΄λ μμ€ κ°μ Έμ€κΈ°: νμΌ, λ¬Έμμ΄ λλ λ€νΈμν¬ λ¦¬μμ€μμ GLSL μμ€ μ½λλ₯Ό κ²μν©λλ€.
- μμ€ νμ±νκΈ°: μ κ· ννμ λλ μ μ© GLSL νμλ₯Ό μ¬μ©νμ¬ uniform, attribute, varying μ μΈμ μλ³ν©λλ€.
- μ 보 μΆμΆνκΈ°: μ μΈλ κ° λ³μμ λν μ΄λ¦, μ ν λ° κ΄λ ¨ νμ μ(μ: `const`, `layout`)λ₯Ό μΆμΆν©λλ€.
- μ 보 μ μ₯νκΈ°: μΆμΆλ μ 보λ₯Ό λμ€μ μ¬μ©ν μ μλλ‘ λ°μ΄ν° ꡬ쑰μ μ μ₯ν©λλ€. μΌλ°μ μΌλ‘ μ΄λ JavaScript κ°μ²΄λ λ°°μ΄μ λλ€.
μμ (μ κ· ννμ μ¬μ©):
```javascript function reflectShader(shaderSource) { const uniforms = []; const attributes = []; // uniform μ μΈκ³Ό μΌμΉνλ μ κ·μ const uniformRegex = /uniform\s+([^\s]+)\s+([^\s;]+)\s*;/g; let match; while ((match = uniformRegex.exec(shaderSource)) !== null) { uniforms.push({ type: match[1], name: match[2], }); } // attribute μ μΈκ³Ό μΌμΉνλ μ κ·μ const attributeRegex = /attribute\s+([^\s]+)\s+([^\s;]+)\s*;/g; while ((match = attributeRegex.exec(shaderSource)) !== null) { attributes.push({ type: match[1], name: match[2], }); } return { uniforms: uniforms, attributes: attributes, }; } // μ¬μ© μμ: const vertexShaderSource = ` attribute vec3 a_position; attribute vec2 a_texCoord; uniform mat4 u_modelViewProjectionMatrix; varying vec2 v_texCoord; void main() { gl_Position = u_modelViewProjectionMatrix * vec4(a_position, 1.0); v_texCoord = a_texCoord; } `; const reflectionData = reflectShader(vertexShaderSource); console.log(reflectionData); ```νκ³μ :
- 볡μ‘μ±: GLSL νμ±μ νΉν μ μ²λ¦¬κΈ° μ§μλ¬Έ, μ£Όμ λ° λ³΅μ‘ν λ°μ΄ν° ꡬ쑰λ₯Ό λ€λ£° λ 볡μ‘ν μ μμ΅λλ€.
- μ νμ±: μ κ· ννμμ λͺ¨λ GLSL ꡬ문μ λν΄ μΆ©λΆν μ ννμ§ μμ μ μμΌλ©°, μ μ¬μ μΌλ‘ μλͺ»λ 리νλ μ λ°μ΄ν°λ₯Ό μ΄λν μ μμ΅λλ€.
- μ μ§λ³΄μ: νμ± λ‘μ§μ μλ‘μ΄ GLSL κΈ°λ₯ λ° κ΅¬λ¬Έ λ³κ²½μ μ§μνκΈ° μν΄ μ λ°μ΄νΈλμ΄μΌ ν©λλ€.
μΈλΆ λΌμ΄λΈλ¬λ¦¬ μ¬μ©
μλ νμ±μ νκ³λ₯Ό 극볡νκΈ° μν΄, GLSL νμ± λ° λ¦¬νλ μ μ μν΄ νΉλ³ν μ€κ³λ μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©ν μ μμ΅λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μ’ μ’ λ κ°λ ₯νκ³ μ νν νμ± κΈ°λ₯μ μ 곡νμ¬ μ °μ΄λ μΈνΈλ‘μ€νμ κ³Όμ μ λ¨μνν©λλ€.
λΌμ΄λΈλ¬λ¦¬ μμ:
- glsl-parser: GLSL μμ€ μ½λλ₯Ό νμ±νκΈ° μν JavaScript λΌμ΄λΈλ¬λ¦¬μ λλ€. μ °μ΄λμ μΆμ ꡬ문 νΈλ¦¬(AST) ννμ μ 곡νμ¬ μ 보λ₯Ό λΆμνκ³ μΆμΆνκΈ° μ½κ² λ§λλλ€.
- shaderc: GLSL(λ° HLSL)μ© μ»΄νμΌλ¬ ν΄μ²΄μΈμΌλ‘, 리νλ μ λ°μ΄ν°λ₯Ό JSON νμμΌλ‘ μΆλ ₯ν μ μμ΅λλ€. μ΄λ μ °μ΄λλ₯Ό 미리 μ»΄νμΌν΄μΌ νμ§λ§ λ§€μ° μ νν μ 보λ₯Ό μ 곡ν μ μμ΅λλ€.
νμ± λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μν¬νλ‘μ°:
- λΌμ΄λΈλ¬λ¦¬ μ€μΉ: npmμ΄λ yarnκ³Ό κ°μ ν¨ν€μ§ κ΄λ¦¬μλ₯Ό μ¬μ©νμ¬ μ νν GLSL νμ± λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μΉν©λλ€.
- μ °μ΄λ μμ€ νμ±: λΌμ΄λΈλ¬λ¦¬μ APIλ₯Ό μ¬μ©νμ¬ GLSL μμ€ μ½λλ₯Ό νμ±ν©λλ€.
- AST μν: νμκ° μμ±ν μΆμ ꡬ문 νΈλ¦¬(AST)λ₯Ό μννμ¬ μ λνΌ λ³μ, μ΄νΈλ¦¬λ·°νΈ λ³μ λ° κΈ°ν κ΄λ ¨ μ °μ΄λ μμμ λν μ 보λ₯Ό μλ³νκ³ μΆμΆν©λλ€.
- μ 보 μ μ₯: μΆμΆλ μ 보λ₯Ό λμ€μ μ¬μ©ν μ μλλ‘ λ°μ΄ν° ꡬ쑰μ μ μ₯ν©λλ€.
μμ (κ°μμ GLSL νμ μ¬μ©):
```javascript // κ°μμ GLSL νμ λΌμ΄λΈλ¬λ¦¬ const glslParser = { parse: function(source) { /* ... */ } }; function reflectShaderWithParser(shaderSource) { const ast = glslParser.parse(shaderSource); const uniforms = []; const attributes = []; // ASTλ₯Ό μννμ¬ uniform λ° attribute μ μΈ μ°ΎκΈ° ast.traverse(node => { if (node.type === 'UniformDeclaration') { uniforms.push({ type: node.dataType, name: node.identifier, }); } else if (node.type === 'AttributeDeclaration') { attributes.push({ type: node.dataType, name: node.identifier, }); } }); return { uniforms: uniforms, attributes: attributes, }; } // μ¬μ© μμ: const vertexShaderSource = ` attribute vec3 a_position; attribute vec2 a_texCoord; uniform mat4 u_modelViewProjectionMatrix; varying vec2 v_texCoord; void main() { gl_Position = u_modelViewProjectionMatrix * vec4(a_position, 1.0); v_texCoord = a_texCoord; } `; const reflectionData = reflectShaderWithParser(vertexShaderSource); console.log(reflectionData); ```μ΄μ :
- κ²¬κ³ μ±: νμ± λΌμ΄λΈλ¬λ¦¬λ μλ μ κ· ννμλ³΄λ€ λ κ²¬κ³ νκ³ μ νν νμ± κΈ°λ₯μ μ 곡ν©λλ€.
- μ¬μ© μ©μ΄μ±: μ °μ΄λ μΈνΈλ‘μ€νμ κ³Όμ μ λ¨μννλ κ³ μμ€ APIλ₯Ό μ 곡ν©λλ€.
- μ μ§λ³΄μμ±: λΌμ΄λΈλ¬λ¦¬λ μΌλ°μ μΌλ‘ μλ‘μ΄ GLSL κΈ°λ₯ λ° κ΅¬λ¬Έ λ³κ²½μ μ§μνλλ‘ μ μ§ λ° μ λ°μ΄νΈλ©λλ€.
μ °μ΄λ 리νλ μ μ μ€μ μ μ© μ¬λ‘
μ °μ΄λ 리νλ μ μ λ€μκ³Ό κ°μ κ΄λ²μν WebGL μ ν리μΌμ΄μ μ μ μ©λ μ μμ΅λλ€:
μ¬μ§ μμ€ν
μμ μΈκΈνλ―μ΄, μ °μ΄λ 리νλ μ μ λμ μ¬μ§ μμ€ν μ ꡬμΆνλ λ° λ§€μ° μ μ©ν©λλ€. νΉμ μ¬μ§κ³Ό κ΄λ ¨λ μ °μ΄λλ₯Ό κ²μ¬ν¨μΌλ‘μ¨ νμν ν μ€μ², μμ λ° κΈ°ν νλΌλ―Έν°λ₯Ό μλμΌλ‘ κ²°μ νκ³ κ·Έμ λ°λΌ λ°μΈλ©ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ λλ§ μ½λλ₯Ό μμ νμ§ μκ³ λ λ€λ₯Έ μ¬μ§ κ°μ μ½κ² μ νν μ μμ΅λλ€.
μμ: κ²μ μμ§μ μ °μ΄λ 리νλ μ μ μ¬μ©νμ¬ λ¬Όλ¦¬ κΈ°λ° λ λλ§(PBR) μ¬μ§μ νμν ν μ€μ² μ λ ₯μ κ²°μ νκ³ , κ° μ¬μ§μ λν΄ μ¬λ°λ₯Έ μλ² λ, λ Έλ©, κ±°μΉ κΈ° λ° κΈμμ± ν μ€μ²κ° λ°μΈλ©λλλ‘ λ³΄μ₯ν μ μμ΅λλ€.
μ λλ©μ΄μ μμ€ν
골격 μ λλ©μ΄μ μ΄λ λ€λ₯Έ μ λλ©μ΄μ κΈ°μ λ‘ μμ ν λ, μ °μ΄λ 리νλ μ μ μ¬μ©νμ¬ μ μ ν λΌ νλ ¬μ΄λ λ€λ₯Έ μ λλ©μ΄μ λ°μ΄ν°λ₯Ό μ °μ΄λμ μλμΌλ‘ λ°μΈλ©ν μ μμ΅λλ€. μ΄λ 볡μ‘ν 3D λͺ¨λΈμ μ λλ©μ΄μ νλ κ³Όμ μ λ¨μνν©λλ€.
μμ: μΊλ¦ν° μ λλ©μ΄μ μμ€ν μ μ °μ΄λ 리νλ μ μ μ¬μ©νμ¬ λΌ νλ ¬μ μ μ₯νλ λ° μ¬μ©λλ μ λνΌ λ°°μ΄μ μλ³νκ³ , κ° νλ μμ λν νμ¬ λΌ λ³νμΌλ‘ λ°°μ΄μ μλμΌλ‘ μ λ°μ΄νΈν μ μμ΅λλ€.
λλ²κΉ λꡬ
μ °μ΄λ 리νλ μ μ μ¬μ©νμ¬ μ λνΌ λ³μμ μ΄νΈλ¦¬λ·°νΈ λ³μμ μ΄λ¦, μ ν λ° μμΉμ κ°μ μ °μ΄λ νλ‘κ·Έλ¨μ λν μμΈν μ 보λ₯Ό μ 곡νλ λλ²κΉ λꡬλ₯Ό λ§λ€ μ μμ΅λλ€. μ΄λ μ€λ₯λ₯Ό μλ³νκ±°λ μ °μ΄λ μ±λ₯μ μ΅μ ννλ λ° λμμ΄ λ μ μμ΅λλ€.
μμ: WebGL λλ²κ±°λ μ °μ΄λμ λͺ¨λ μ λνΌ λ³μ λͺ©λ‘κ³Ό νμ¬ κ°μ νμνμ¬ κ°λ°μκ° μ °μ΄λ νλΌλ―Έν°λ₯Ό μ½κ² κ²μ¬νκ³ μμ ν μ μλλ‘ ν μ μμ΅λλ€.
μ μ°¨μ μ½ν μΈ μμ±
μ °μ΄λ 리νλ μ μ μ μ°¨μ μμ± μμ€ν μ΄ μλ‘κ±°λ μμ λ μ °μ΄λμ λμ μΌλ‘ μ μν μ μκ² ν©λλ€. μ¬μ©μ μ λ ₯μ΄λ λ€λ₯Έ 쑰건μ λ°λΌ μ¦μμμ μ °μ΄λκ° μμ±λλ μμ€ν μ μμν΄ λ³΄μΈμ. 리νλ μ μ ν΅ν΄ μμ€ν μ μ΄λ¬ν μμ±λ μ °μ΄λμ μꡬ μ¬νμ 미리 μ μν νμ μμ΄ μ΄ν΄ν μ μμ΅λλ€.
μμ: μ§ν μμ± λꡬλ λ€λ₯Έ μλ¬Ό κ΅°κ³μ λν μ¬μ©μ μ μ μ °μ΄λλ₯Ό μμ±ν μ μμ΅λλ€. μ °μ΄λ 리νλ μ μ ν΅ν΄ μ΄ λꡬλ μ΄λ€ ν μ€μ²μ νλΌλ―Έν°(μ: λ λμ΄, λ무 λ°λ)κ° κ° μλ¬Ό κ΅°κ³μ μ °μ΄λμ μ λ¬λμ΄μΌ νλμ§ μ΄ν΄ν μ μμ΅λλ€.
κ³ λ €μ¬ν λ° λͺ¨λ² μ¬λ‘
μ °μ΄λ 리νλ μ μ μλΉν μ΄μ μ μ 곡νμ§λ§ λ€μ μ¬νμ κ³ λ €νλ κ²μ΄ μ€μν©λλ€:
μ±λ₯ μ€λ²ν€λ
GLSL μμ€ μ½λλ₯Ό νμ±νκ±°λ ASTλ₯Ό μννλ κ²μ νΉν 볡μ‘ν μ °μ΄λμ κ²½μ° κ³μ° λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€. μΌλ°μ μΌλ‘ μ °μ΄λκ° λ‘λλ λ ν λ²λ§ μ °μ΄λ 리νλ μ μ μννκ³ λμ€μ μ¬μ©ν μ μλλ‘ κ²°κ³Όλ₯Ό μΊμνλ κ²μ΄ μ’μ΅λλ€. λ λλ§ λ£¨νμμ μ °μ΄λ 리νλ μ μ μννλ κ²μ μ±λ₯μ ν° μν₯μ λ―ΈμΉ μ μμΌλ―λ‘ νΌν΄μΌ ν©λλ€.
볡μ‘μ±
μ °μ΄λ 리νλ μ μ ꡬννλ κ²μ 볡μ‘ν μ μμΌλ©°, νΉν 볡μ‘ν GLSL ꡬ문μ λ€λ£¨κ±°λ κ³ κΈ νμ± λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν λ κ·Έλ μ΅λλ€. 리νλ μ λ‘μ§μ μ μ€νκ² μ€κ³νκ³ μ νμ±κ³Ό κ²¬κ³ μ±μ 보μ₯νκΈ° μν΄ μ² μ ν ν μ€νΈνλ κ²μ΄ μ€μν©λλ€.
μ °μ΄λ νΈνμ±
μ °μ΄λ 리νλ μ μ GLSL μμ€ μ½λμ ꡬ쑰μ ꡬ문μ μμ‘΄ν©λλ€. μ °μ΄λ μμ€μ λ³κ²½μ 리νλ μ λ‘μ§μ κΉ¨λ¨λ¦΄ μ μμ΅λλ€. 리νλ μ λ‘μ§μ΄ μ °μ΄λ μ½λμ λ³νμ μ²λ¦¬ν μ μμ λ§νΌ κ²¬κ³ νμ§ νμΈνκ±°λ νμν λ μ λ°μ΄νΈν μ μλ λ©μ»€λμ¦μ μ 곡ν΄μΌ ν©λλ€.
WebGL 2μ λμ
WebGL 2λ μμ ν 리νλ μ APIλ μλμ§λ§ WebGL 1μ λΉν΄ μΌλΆ μ νμ μΈ μΈνΈλ‘μ€νμ κΈ°λ₯μ μ 곡ν©λλ€. `gl.getActiveUniform()` λ° `gl.getActiveAttrib()`λ₯Ό μ¬μ©νμ¬ μ °μ΄λμμ νλ°νκ² μ¬μ©λλ μ λνΌ λ° μ΄νΈλ¦¬λ·°νΈμ λν μ 보λ₯Ό μ»μ μ μμ΅λλ€. κ·Έλ¬λ μ΄λ μ¬μ ν μ λνΌ λλ μ΄νΈλ¦¬λ·°νΈμ μΈλ±μ€λ₯Ό μμμΌ νλ©°, μ΄λ μΌλ°μ μΌλ‘ νλμ½λ©νκ±°λ μ °μ΄λ μμ€λ₯Ό νμ±ν΄μΌ ν©λλ€. λν μ΄λ¬ν λ©μλλ μμ ν 리νλ μ APIκ° μ 곡νλ κ²λ§νΌ λ§μ μΈλΆ μ 보λ₯Ό μ 곡νμ§ μμ΅λλ€.
μΊμ± λ° μ΅μ ν
μμ μΈκΈνλ―μ΄ μ °μ΄λ 리νλ μ μ ν λ²λ§ μννκ³ κ²°κ³Όλ₯Ό μΊμν΄μΌ ν©λλ€. 리νλ μ λ λ°μ΄ν°λ μ λνΌ λ° μ΄νΈλ¦¬λ·°νΈ μμΉλ₯Ό ν¨μ¨μ μΌλ‘ μ‘°νν μ μλ ꡬ쑰νλ νμ(μ: JavaScript κ°μ²΄ λλ Map)μΌλ‘ μ μ₯λμ΄μΌ ν©λλ€.
κ²°λ‘
μ °μ΄λ 리νλ μ μ WebGL μ ν리μΌμ΄μ μμ λμ μ °μ΄λ κ΄λ¦¬, μ½λ μ¬μ¬μ©μ± λ° μ€λ₯ λ°©μ§λ₯Ό μν κ°λ ₯ν κΈ°μ μ λλ€. μ °μ΄λ 리νλ μ μ μ리μ ꡬν μΈλΆ μ¬νμ μ΄ν΄ν¨μΌλ‘μ¨ λ μ μ°νκ³ μ μ§λ³΄μ κ°λ₯νλ©° μ±λ₯μ΄ λ°μ΄λ WebGL κ²½νμ λ§λ€ μ μμ΅λλ€. 리νλ μ μ ꡬννλ λ°λ μ½κ°μ λ Έλ ₯μ΄ νμνμ§λ§, νΉν ν¬κ³ 볡μ‘ν νλ‘μ νΈμμλ κ·Έ μ΄μ μ΄ λΉμ©μ λ₯κ°νλ κ²½μ°κ° λ§μ΅λλ€. νμ± κΈ°μ μ΄λ μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©ν¨μΌλ‘μ¨ κ°λ°μλ μ °μ΄λ 리νλ μ μ νμ ν¨κ³Όμ μΌλ‘ νμ©νμ¬ μ§μ μΌλ‘ λμ μ΄κ³ μ μμ± μλ WebGL μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.