κ°λ ₯ν WebGL μ °μ΄λ μ λνΌ λμ λ°μΈλ©μ μΈκ³λ₯Ό νννμ¬ λ°νμ 리μμ€ μ°κ²°κ³Ό λμ μκ° ν¨κ³Όλ₯Ό ꡬννμΈμ. μ΄ κ°μ΄λλ μ μΈκ³ κ°λ°μλ₯Ό μν ν¬κ΄μ μΈ κ°μλ₯Ό μ 곡ν©λλ€.
WebGL μ °μ΄λ μ λνΌ λμ λ°μΈλ©: λ°νμ 리μμ€ μ°κ²°
κ°λ ₯ν μΉ κ·Έλν½μ€ λΌμ΄λΈλ¬λ¦¬μΈ WebGLμ κ°λ°μλ€μ΄ μΉ λΈλΌμ°μ μμ μ§μ λνν 3D λ° 2D κ·Έλν½μ λ§λ€ μ μλλ‘ μ§μν©λλ€. WebGLμ ν΅μ¬μ κ·Έλν½ μ²λ¦¬ μ₯μΉ(GPU)λ₯Ό νμ©νμ¬ λ³΅μ‘ν μ₯λ©΄μ ν¨μ¨μ μΌλ‘ λ λλ§νλ κ²μ λλ€. WebGL κΈ°λ₯μ μ€μν μΈ‘λ©΄μ μ΅μ’ μ΄λ―Έμ§λ₯Ό μμ±νκΈ° μν΄ μ μ κ³Ό νλκ·Έλ¨ΌνΈκ° μ²λ¦¬λλ λ°©μμ κ²°μ νλ GPUμμ μ€νλλ μμ νλ‘κ·Έλ¨μΈ μ °μ΄λλ₯Ό ν¬ν¨ν©λλ€. μ κ΅ν μκ° ν¨κ³Όμ λνν κ²½νμ λ¬μ±νκΈ° μν΄μλ λ°νμμ 리μμ€λ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νκ³ μ °μ΄λ λμμ μ μ΄νλ λ°©λ²μ μ΄ν΄νλ κ²μ΄ 무μλ³΄λ€ μ€μν©λλ€. μ΄ κΈμμλ WebGL μ °μ΄λ μ λνΌ λμ λ°μΈλ©μ 볡μ‘μ±μ κΉμ΄ νκ³ λ€μ΄ μ μΈκ³ κ°λ°μλ₯Ό μν ν¬κ΄μ μΈ κ°μ΄λλ₯Ό μ 곡ν©λλ€.
μ °μ΄λμ μ λνΌ μ΄ν΄νκΈ°
λμ λ°μΈλ©μ λν΄ μμ보기 μ μ, ννν κΈ°μ΄λ₯Ό λ€μ Έλ΄ μλ€. μ °μ΄λλ OpenGL μ °μ΄λ© μΈμ΄(GLSL)λ‘ μμ±λμ΄ GPUμμ μ€νλλ νλ‘κ·Έλ¨μ λλ€. μ °μ΄λμλ μ£Όλ‘ μ μ μ °μ΄λμ νλκ·Έλ¨ΌνΈ μ °μ΄λ λ κ°μ§ μ νμ΄ μμ΅λλ€. μ μ μ °μ΄λλ μ μ λ°μ΄ν°(μμΉ, λ²μ , ν μ€μ² μ’ν λ±)λ₯Ό λ³ννλ μν μ νλ©°, νλκ·Έλ¨ΌνΈ μ °μ΄λλ κ° ν½μ μ μ΅μ’ μμμ κ²°μ ν©λλ€.
μ λνΌμ μλ°μ€ν¬λ¦½νΈ μ½λμμ μ °μ΄λ νλ‘κ·Έλ¨μΌλ‘ μ λ¬λλ λ³μμ λλ€. μ΄λ€μ λ¨μΌ ν리미ν°λΈ(μ: μΌκ°ν, μ¬κ°ν)λ₯Ό λ λλ§νλ λμ κ°μ΄ μΌμ νκ² μ μ§λλ μ μ μ½κΈ° μ μ© λ³μ μν μ ν©λλ€. μ λνΌμ λ€μκ³Ό κ°μ μ °μ΄λ λμμ λ€μν μΈ‘λ©΄μ μ μ΄νλ λ° μ¬μ©λ©λλ€:
- λͺ¨λΈ-λ·°-ν¬μ νλ ¬: 3D κ°μ²΄λ₯Ό λ³ννλ λ° μ¬μ©λ©λλ€.
- κ΄μ μμ λ° μμΉ: μ‘°λͺ κ³μ°μ μ¬μ©λ©λλ€.
- ν μ€μ² μνλ¬: ν μ€μ²μ μ κ·Όνκ³ μνλ§νλ λ° μ¬μ©λ©λλ€.
- μ¬μ§ μμ±: νλ©΄μ λͺ¨μμ μ μνλ λ° μ¬μ©λ©λλ€.
- μκ° λ³μ: μ λλ©μ΄μ μ λ§λλ λ° μ¬μ©λ©λλ€.
λμ λ°μΈλ©μ λ§₯λ½μμ, ν μ€μ²λ λ²νΌ κ°μ²΄μ κ°μ 리μμ€λ₯Ό μ°Έμ‘°νλ μ λνΌμ νΉν μ€μν©λλ€. μ΄λ₯Ό ν΅ν΄ μ °μ΄λκ° μ¬μ©νλ 리μμ€λ₯Ό λ°νμμ μμ ν μ μμ΅λλ€.
μ ν΅μ μΈ μ κ·Ό λ°©μ: μ¬μ μ μλ μ λνΌκ³Ό μ μ λ°μΈλ©
μμ¬μ μΌλ‘ WebGL μ΄κΈ°μλ μ λνΌμ μ²λ¦¬νλ μ κ·Ό λ°©μμ΄ λλΆλΆ μ μ μ΄μμ΅λλ€. κ°λ°μλ€μ GLSL μ
°μ΄λ μ½λμ μ λνΌμ μ μν λ€μ, μλ°μ€ν¬λ¦½νΈ μ½λμμ gl.getUniformLocation()κ³Ό κ°μ ν¨μλ₯Ό μ¬μ©νμ¬ μ΄λ¬ν μ λνΌμ μμΉλ₯Ό κ²μνμ΅λλ€. κ·Έ ν, μ λνΌμ μ νμ λ°λΌ gl.uniform1f(), gl.uniform3fv(), gl.uniformMatrix4fv()μ κ°μ ν¨μλ₯Ό μ¬μ©νμ¬ μ λνΌ κ°μ μ€μ νμ΅λλ€.
μμ (κ°μν):
GLSL μ °μ΄λ (μ μ μ °μ΄λ):
#version 300 es
uniform mat4 u_modelViewProjectionMatrix;
uniform vec4 u_color;
in vec4 a_position;
void main() {
gl_Position = u_modelViewProjectionMatrix * a_position;
}
GLSL μ °μ΄λ (νλκ·Έλ¨ΌνΈ μ °μ΄λ):
#version 300 es
precision mediump float;
uniform vec4 u_color;
out vec4 fragColor;
void main() {
fragColor = u_color;
}
μλ°μ€ν¬λ¦½νΈ μ½λ:
const program = createShaderProgram(gl, vertexShaderSource, fragmentShaderSource);
const modelViewProjectionMatrixLocation = gl.getUniformLocation(program, 'u_modelViewProjectionMatrix');
const colorLocation = gl.getUniformLocation(program, 'u_color');
// ... in the render loop ...
gl.useProgram(program);
gl.uniformMatrix4fv(modelViewProjectionMatrixLocation, false, modelViewProjectionMatrix);
gl.uniform4fv(colorLocation, color);
// ... draw calls ...
μ΄ μ κ·Ό λ°©μμ μλ²½νκ² μ ν¨νλ©° μ¬μ ν λ리 μ¬μ©λ©λλ€. κ·Έλ¬λ λμ 리μμ€ κ΅μ²΄λ 볡μ‘ν λ°μ΄ν° κΈ°λ° ν¨κ³Όκ° νμν μλ리μ€λ₯Ό μ²λ¦¬ν λλ μ μ°μ±μ΄ λ¨μ΄μ§λλ€. μ¬μ©μ μνΈ μμ©μ λ°λΌ κ°μ²΄μ λ€λ₯Έ ν μ€μ²λ₯Ό μ μ©ν΄μΌ νκ±°λ, κ°κ° μ μ¬μ μΌλ‘ μ μλ§ μ¬μ©λλ λ°©λν μμ ν μ€μ²λ‘ μ₯λ©΄μ λ λλ§ν΄μΌ νλ μλ리μ€λ₯Ό μμν΄ λ³΄μμμ€. λ§μ μμ μ¬μ μ μλ μ λνΌμ κ΄λ¦¬νλ κ²μ λ²κ±°λ‘κ³ λΉν¨μ¨μ μΌ μ μμ΅λλ€.
WebGL 2.0μ λ±μ₯κ³Ό μ λνΌ λ²νΌ κ°μ²΄(UBO) λ° λ°μΈλ© κ°λ₯ν 리μμ€ μΈλ±μ€μ ν
OpenGL ES 3.0μ κΈ°λ°μΌλ‘ νλ WebGL 2.0μ μ£Όλ‘ μ λνΌ λ²νΌ κ°μ²΄(UBO)μ λ°μΈλ© κ°λ₯ν 리μμ€ μΈλ±μ€μ λμ μ ν΅ν΄ 리μμ€ κ΄λ¦¬μ μλΉν κ°μ μ κ°μ Έμμ΅λλ€. μ΄λ¬ν κΈ°λ₯μ λ°νμμ 리μμ€λ₯Ό μ °μ΄λμ λμ μΌλ‘ λ°μΈλ©νλ λ κ°λ ₯νκ³ μ μ°ν λ°©λ²μ μ 곡ν©λλ€. μ΄ ν¨λ¬λ€μ μ νμ ν΅ν΄ κ°λ°μλ€μ 리μμ€ λ°μΈλ©μ λ°μ΄ν° κ΅¬μ± νλ‘μΈμ€μ²λΌ μ·¨κΈνμ¬ λ³΅μ‘ν μ °μ΄λ μνΈ μμ©μ λ¨μνν μ μμ΅λλ€.
μ λνΌ λ²νΌ κ°μ²΄(UBO)
UBOλ λ³Έμ§μ μΌλ‘ GPU λ΄μ μ μ© λ©λͺ¨λ¦¬ λ²νΌλ‘ μ λνΌ κ°μ 보μ ν©λλ€. μ΄λ μ ν΅μ μΈ λ°©λ²μ λΉν΄ λͺ κ°μ§ μ₯μ μ μ 곡ν©λλ€:
- μ‘°μ§ν: UBOλ₯Ό μ¬μ©νλ©΄ κ΄λ ¨ μ λνΌμ ν¨κ» κ·Έλ£Ήννμ¬ μ½λ κ°λ μ±κ³Ό μ μ§ κ΄λ¦¬μ±μ ν₯μμν¬ μ μμ΅λλ€.
- ν¨μ¨μ±: μ λνΌ μ λ°μ΄νΈλ₯Ό κ·Έλ£Ήννμ¬ GPU νΈμΆ μλ₯Ό μ€μΌ μ μμΌλ©°, νΉν μλ§μ μ λνΌμ μ¬μ©ν λ μ±λ₯ ν₯μμ κ°μ Έμ΅λλ€.
- 곡μ μ λνΌ: μ¬λ¬ μ °μ΄λκ° λμΌν UBOλ₯Ό μ°Έμ‘°ν μ μμ΄ λ€λ₯Έ λ λλ§ ν¨μ€λ κ°μ²΄ κ°μ μ λνΌ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ 곡μ ν μ μμ΅λλ€.
μμ :
GLSL μ °μ΄λ (UBOλ₯Ό μ¬μ©νλ νλκ·Έλ¨ΌνΈ μ °μ΄λ):
#version 300 es
precision mediump float;
layout(std140) uniform LightBlock {
vec3 lightColor;
vec3 lightPosition;
} light;
out vec4 fragColor;
void main() {
// Perform lighting calculations using light.lightColor and light.lightPosition
fragColor = vec4(light.lightColor, 1.0);
}
μλ°μ€ν¬λ¦½νΈ μ½λ:
const lightData = new Float32Array([0.8, 0.8, 0.8, // lightColor (R, G, B)
1.0, 2.0, 3.0]); // lightPosition (X, Y, Z)
const lightBuffer = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, lightBuffer);
gl.bufferData(gl.UNIFORM_BUFFER, lightData, gl.STATIC_DRAW);
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
const lightBlockIndex = gl.getUniformBlockIndex(program, 'LightBlock');
gl.uniformBlockBinding(program, lightBlockIndex, 0); // Bind the UBO to binding point 0.
gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, lightBuffer);
GLSL μ½λμ layout(std140) νμ μλ UBOμ λ©λͺ¨λ¦¬ λ μ΄μμμ μ μν©λλ€. μλ°μ€ν¬λ¦½νΈ μ½λλ λ²νΌλ₯Ό μμ±νκ³ μ‘°λͺ
λ°μ΄ν°λ‘ μ±μ΄ λ€μ νΉμ λ°μΈλ© ν¬μΈνΈ(μ΄ μμμλ λ°μΈλ© ν¬μΈνΈ 0)μ λ°μΈλ©ν©λλ€. κ·Έλ¬λ©΄ μ
°μ΄λκ° μ΄ λ°μΈλ© ν¬μΈνΈμ μ°κ²°λμ΄ UBOμ λ°μ΄ν°μ μ κ·Όν μ μκ² λ©λλ€.
ν μ€μ² λ° μνλ¬λ₯Ό μν λ°μΈλ© κ°λ₯ν 리μμ€ μΈλ±μ€
λμ λ°μΈλ©μ λ¨μννλ WebGL 2.0μ ν΅μ¬ κΈ°λ₯μ ν
μ€μ² λλ μνλ¬ μ λνΌμ νΉμ λ°μΈλ© μΈλ±μ€μ μ°κ²°νλ κΈ°λ₯μ
λλ€. κ° μνλ¬μ μμΉλ₯Ό gl.getUniformLocation()μ μ¬μ©νμ¬ κ°λ³μ μΌλ‘ μ§μ ν νμ μμ΄ λ°μΈλ© ν¬μΈνΈλ₯Ό νμ©ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ 리μμ€ κ΅μ²΄ λ° κ΄λ¦¬κ° ν¨μ¬ μ¬μμ§λλ€. μ΄ μ κ·Ό λ°©μμ μ§μ° μ
°μ΄λ©κ³Ό κ°μ κ³ κΈ λ λλ§ κΈ°μ μ ꡬννλ λ° νΉν μ€μνλ©°, λ°νμ 쑰건μ λ°λΌ λ¨μΌ κ°μ²΄μ μ¬λ¬ ν
μ€μ²λ₯Ό μ μ©ν΄μΌ ν μ μμ΅λλ€.
μμ (λ°μΈλ© κ°λ₯ν 리μμ€ μΈλ±μ€ μ¬μ©):
GLSL μ °μ΄λ (νλκ·Έλ¨ΌνΈ μ °μ΄λ):
#version 300 es
precision mediump float;
uniform sampler2D u_texture;
in vec2 v_texCoord;
out vec4 fragColor;
void main() {
fragColor = texture(u_texture, v_texCoord);
}
μλ°μ€ν¬λ¦½νΈ μ½λ:
const textureLocation = gl.getUniformLocation(program, 'u_texture');
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.uniform1i(textureLocation, 0); // Tell the shader that u_texture uses texture unit 0.
μ΄ μμ μμ μλ°μ€ν¬λ¦½νΈ μ½λλ u_texture μνλ¬μ μμΉλ₯Ό κ°μ Έμ΅λλ€. κ·Έλ° λ€μ gl.activeTexture(gl.TEXTURE0)λ₯Ό μ¬μ©νμ¬ ν
μ€μ² μ λ 0μ νμ±ννκ³ ν
μ€μ²λ₯Ό λ°μΈλ©ν λ€μ gl.uniform1i(textureLocation, 0)μ μ¬μ©νμ¬ μ λνΌ κ°μ 0μΌλ‘ μ€μ ν©λλ€. κ° '0'μ u_texture μνλ¬κ° ν
μ€μ² μ λ 0μ λ°μΈλ©λ ν
μ€μ²λ₯Ό μ¬μ©ν΄μΌ ν¨μ λνλ
λλ€.
λμ λ°μΈλ©μ μ€μ : ν μ€μ² κ΅μ²΄
μ€μ©μ μΈ μμ μΈ ν μ€μ² κ΅μ²΄λ₯Ό ν΅ν΄ λμ λ°μΈλ©μ νμ μ€λͺ ν΄ λ³΄κ² μ΅λλ€. μ¬μ©μ μνΈ μμ©(μ: λͺ¨λΈ ν΄λ¦)μ λ°λΌ λ€λ₯Έ ν μ€μ²λ₯Ό νμν΄μΌ νλ 3D λͺ¨λΈμ μμν΄ λ³΄μμμ€. λμ λ°μΈλ©μ μ¬μ©νλ©΄ μ °μ΄λλ₯Ό λ€μ μ»΄νμΌνκ±°λ λ€μ λ‘λν νμ μμ΄ ν μ€μ² κ°μ μννκ² μ νν μ μμ΅λλ€.
μλ리μ€: μ¬μ©μκ° ν΄λ¦νλ λ©΄μ λ°λΌ λ€λ₯Έ ν μ€μ²λ₯Ό νμνλ 3D νλΈ. μ μ μ °μ΄λμ νλκ·Έλ¨ΌνΈ μ °μ΄λλ₯Ό μ¬μ©ν κ²μ λλ€. μ μ μ °μ΄λλ ν μ€μ² μ’νλ₯Ό μ λ¬ν©λλ€. νλκ·Έλ¨ΌνΈ μ °μ΄λλ ν μ€μ² μ’νλ₯Ό μ¬μ©νμ¬ μ λνΌ μνλ¬μ λ°μΈλ©λ ν μ€μ²λ₯Ό μνλ§ν©λλ€.
μμ ꡬν (κ°μν):
μ μ μ °μ΄λ:
#version 300 es
in vec4 a_position;
in vec2 a_texCoord;
out vec2 v_texCoord;
uniform mat4 u_modelViewProjectionMatrix;
void main() {
gl_Position = u_modelViewProjectionMatrix * a_position;
v_texCoord = a_texCoord;
}
νλκ·Έλ¨ΌνΈ μ °μ΄λ:
#version 300 es
precision mediump float;
in vec2 v_texCoord;
uniform sampler2D u_texture;
out vec4 fragColor;
void main() {
fragColor = texture(u_texture, v_texCoord);
}
μλ°μ€ν¬λ¦½νΈ μ½λ:
// ... Initialization (create WebGL context, shaders, etc.) ...
const textureLocation = gl.getUniformLocation(program, 'u_texture');
// Load textures
const texture1 = loadTexture(gl, 'texture1.png');
const texture2 = loadTexture(gl, 'texture2.png');
const texture3 = loadTexture(gl, 'texture3.png');
// ... (load more textures)
// Initially display texture1
let currentTexture = texture1;
// Function to handle texture swap
function swapTexture(newTexture) {
currentTexture = newTexture;
}
// Render loop
function render() {
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.useProgram(program);
// Set up texture unit 0 for our texture.
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, currentTexture);
gl.uniform1i(textureLocation, 0);
// ... draw the cube using the appropriate vertex and index data ...
requestAnimationFrame(render);
}
// Example user interaction (e.g., a click event)
document.addEventListener('click', (event) => {
// Determine which side of the cube was clicked (logic omitted for brevity)
// ...
if (clickedSide === 'side1') {
swapTexture(texture1);
} else if (clickedSide === 'side2') {
swapTexture(texture2);
} else {
swapTexture(texture3);
}
});
render();
μ΄ μ½λμ ν΅μ¬ λ¨κ³λ λ€μκ³Ό κ°μ΅λλ€:
- ν
μ€μ² λ‘λ©:
loadTexture()ν¨μλ₯Ό μ¬μ©νμ¬ μ¬λ¬ ν μ€μ²λ₯Ό λ‘λν©λλ€. - μ λνΌ μμΉ: ν
μ€μ² μνλ¬ μ λνΌ(
u_texture)μ μμΉλ₯Ό μ»μ΅λλ€. - ν
μ€μ² μ λ νμ±ν: λ λ 루ν λ΄μμ
gl.activeTexture(gl.TEXTURE0)κ° ν μ€μ² μ λ 0μ νμ±νν©λλ€. - ν
μ€μ² λ°μΈλ©:
gl.bindTexture(gl.TEXTURE_2D, currentTexture)λ νμ¬ μ νλ ν μ€μ²(currentTexture)λ₯Ό νμ± ν μ€μ² μ λ(0)μ λ°μΈλ©ν©λλ€. - μ λνΌ μ€μ :
gl.uniform1i(textureLocation, 0)λ μ °μ΄λμκ²u_textureμνλ¬κ° ν μ€μ² μ λ 0μ λ°μΈλ©λ ν μ€μ²λ₯Ό μ¬μ©ν΄μΌ νλ€κ³ μ립λλ€. - ν
μ€μ² κ΅μ²΄:
swapTexture()ν¨μλ μ¬μ©μ μνΈ μμ©(μ: λ§μ°μ€ ν΄λ¦)μ λ°λΌcurrentTextureλ³μμ κ°μ λ³κ²½ν©λλ€. μ΄ μ λ°μ΄νΈλ ν μ€μ²λ λ€μ νλ μμμ νλκ·Έλ¨ΌνΈ μ °μ΄λμμ μνλ§λλ ν μ€μ²κ° λ©λλ€.
μ΄ μμ λ λνν μ ν리μΌμ΄μ μ νμμ μΈ λμ ν μ€μ² κ΄λ¦¬μ λν λ§€μ° μ μ°νκ³ ν¨μ¨μ μΈ μ κ·Ό λ°©μμ 보μ¬μ€λλ€.
κ³ κΈ κΈ°μ λ° μ΅μ ν
κΈ°λ³Έμ μΈ ν μ€μ² κ΅μ²΄ μμ λ₯Ό λμ΄, WebGL μ °μ΄λ μ λνΌ λμ λ°μΈλ©κ³Ό κ΄λ ¨λ λͺ κ°μ§ κ³ κΈ κΈ°μ λ° μ΅μ ν μ λ΅μ λ€μκ³Ό κ°μ΅λλ€:
λ€μ€ ν μ€μ² μ λ μ¬μ©
WebGLμ μ¬λ¬ ν μ€μ² μ λ(νλμ¨μ΄μ λ°λΌ μΌλ°μ μΌλ‘ 8-32κ° λλ κ·Έ μ΄μ)μ μ§μν©λλ€. μ °μ΄λμμ λ κ° μ΄μμ ν μ€μ²λ₯Ό μ¬μ©νλ €λ©΄ κ° ν μ€μ²λ₯Ό λ³λμ ν μ€μ² μ λμ λ°μΈλ©νκ³ μλ°μ€ν¬λ¦½νΈ μ½λμ μ °μ΄λ λ΄μμ κ³ μ ν μΈλ±μ€λ₯Ό ν λΉν΄μΌ ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬λ¬ ν μ€μ²λ₯Ό νΌν©νκ±°λ λ μ΄μ΄λ§νμ¬ λ νλΆν μκ°μ λͺ¨μμ λ§λλ λ©ν° ν μ€μ²λ§κ³Ό κ°μ 볡μ‘ν μκ° ν¨κ³Όλ₯Ό ꡬνν μ μμ΅λλ€.
μμ (λ©ν° ν μ€μ²λ§):
νλκ·Έλ¨ΌνΈ μ °μ΄λ:
#version 300 es
precision mediump float;
in vec2 v_texCoord;
uniform sampler2D u_texture1;
uniform sampler2D u_texture2;
out vec4 fragColor;
void main() {
vec4 color1 = texture(u_texture1, v_texCoord);
vec4 color2 = texture(u_texture2, v_texCoord);
fragColor = mix(color1, color2, 0.5); // Blend the textures
}
μλ°μ€ν¬λ¦½νΈ μ½λ:
const texture1Location = gl.getUniformLocation(program, 'u_texture1');
const texture2Location = gl.getUniformLocation(program, 'u_texture2');
// Activate texture unit 0 for texture1
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture1);
gl.uniform1i(texture1Location, 0);
// Activate texture unit 1 for texture2
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, texture2);
gl.uniform1i(texture2Location, 1);
λμ λ²νΌ μ λ°μ΄νΈ
UBOλ λ°νμμ λμ μΌλ‘ μ
λ°μ΄νΈλ μ μμ΄, λ§€ νλ μλ§λ€ μ 체 λ²νΌλ₯Ό λ€μ μ
λ‘λνμ§ μκ³ λ λ²νΌ λ΄μ λ°μ΄ν°λ₯Ό μμ ν μ μμ΅λλ€(λ§μ κ²½μ°). ν¨μ¨μ μΈ μ
λ°μ΄νΈλ μ±λ₯μ λ§€μ° μ€μν©λλ€. μλ₯Ό λ€μ΄, λ³ν νλ ¬μ΄λ μ‘°λͺ
λ§€κ°λ³μλ₯Ό ν¬ν¨νλ UBOλ₯Ό μ
λ°μ΄νΈνλ κ²½μ°, gl.bufferSubData()λ₯Ό μ¬μ©νμ¬ λ²νΌμ μΌλΆλ₯Ό μ
λ°μ΄νΈνλ κ²μ΄ λ§€ νλ μλ§λ€ μ 체 λ²νΌλ₯Ό λ€μ μμ±νλ κ²λ³΄λ€ ν¨μ¬ ν¨μ¨μ μΌ μ μμ΅λλ€.
μμ (UBO μ λ°μ΄νΈ):
// Assuming lightBuffer and lightData are already initialized (as in the UBO example earlier)
// Update light position
const newLightPosition = [1.5, 2.5, 4.0];
const offset = 3 * Float32Array.BYTES_PER_ELEMENT; // Offset in bytes to update lightPosition (lightColor takes the first 3 floats)
gl.bindBuffer(gl.UNIFORM_BUFFER, lightBuffer);
gl.bufferSubData(gl.UNIFORM_BUFFER, offset, new Float32Array(newLightPosition));
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
μ΄ μμ λ gl.bufferSubData()λ₯Ό μ¬μ©νμ¬ κΈ°μ‘΄ lightBuffer λ΄μ κ΄μ μμΉλ₯Ό μ
λ°μ΄νΈν©λλ€. μ€νμ
μ μ¬μ©νλ©΄ λ°μ΄ν° μ μ‘μ μ΅μνν©λλ€. offset λ³μλ λ²νΌμ μ΄λ μμΉμ μΈμ§λ₯Ό μ§μ ν©λλ€. μ΄κ²μ λ°νμμ UBOμ μΌλΆλ₯Ό μ
λ°μ΄νΈνλ λ§€μ° ν¨μ¨μ μΈ λ°©λ²μ
λλ€.
μ °μ΄λ μ»΄νμΌ λ° λ§ν¬ μ΅μ ν
μ °μ΄λ μ»΄νμΌ λ° λ§ν¬λ λΉκ΅μ λΉμ©μ΄ λ§μ΄ λλ μμ μ λλ€. λμ λ°μΈλ© μλ리μ€μ κ²½μ°, μ΄κΈ°ν μ€μ μ °μ΄λλ₯Ό ν λ²λ§ μ»΄νμΌνκ³ λ§ν¬νλ κ²μ λͺ©νλ‘ ν΄μΌ ν©λλ€. λ λ 루ν λ΄μμ μ °μ΄λλ₯Ό λ€μ μ»΄νμΌνκ³ λ§ν¬νλ κ²μ νΌνμμμ€. μ΄λ μ±λ₯μ ν¬κ² ν₯μμν΅λλ€. κ°λ° μ€ λ° λ¦¬μμ€λ₯Ό λ€μ λ‘λν λ λΆνμν μ¬μ»΄νμΌμ λ°©μ§νκΈ° μν΄ μ °μ΄λ μΊμ± μ λ΅μ μ¬μ©νμμμ€.
μ λνΌ μμΉ μΊμ±
gl.getUniformLocation() νΈμΆμ μΌλ°μ μΌλ‘ λΉμ©μ΄ λ§μ΄ λλ μμ
μ μλμ§λ§, μ μ μλ리μ€μμλ νλ μλΉ ν λ²μ© μνλλ κ²½μ°κ° λ§μ΅λλ€. μ΅μ μ μ±λ₯μ μν΄ νλ‘κ·Έλ¨μ΄ λ§ν¬λ ν μ λνΌ μμΉλ₯Ό μΊμνμμμ€. μ΄ μμΉλ€μ λ³μμ μ μ₯νμ¬ λ λ 루νμμ λμ€μ μ¬μ©νμμμ€. μ΄λ κ² νλ©΄ gl.getUniformLocation()μ λν μ€λ³΅ νΈμΆμ μ κ±°ν μ μμ΅λλ€.
λͺ¨λ² μ¬λ‘ λ° κ³ λ € μ¬ν
λμ λ°μΈλ©μ ν¨κ³Όμ μΌλ‘ ꡬννλ €λ©΄ λͺ¨λ² μ¬λ‘λ₯Ό μ€μνκ³ μ μ¬μ μΈ λ¬Έμ λ₯Ό κ³ λ €ν΄μΌ ν©λλ€:
- μ€λ₯ νμΈ: μ λνΌ μμΉλ₯Ό μ»κ±°λ(
gl.getUniformLocation()) 리μμ€λ₯Ό μμ±νκ³ λ°μΈλ©ν λ νμ μ€λ₯λ₯Ό νμΈνμμμ€. WebGL λλ²κ·Έ λꡬλ₯Ό μ¬μ©νμ¬ λ λλ§ λ¬Έμ λ₯Ό κ°μ§νκ³ ν΄κ²°νμμμ€. - 리μμ€ κ΄λ¦¬: ν μ€μ², λ²νΌ λ° μ °μ΄λλ₯Ό μ¬λ°λ₯΄κ² κ΄λ¦¬νμμμ€. λ μ΄μ νμνμ§ μμ 리μμ€λ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκΈ° μν΄ ν΄μ νμμμ€.
- μ±λ₯ νλ‘νμΌλ§: λΈλΌμ°μ κ°λ°μ λꡬ λ° WebGL νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ μ±λ₯ λ³λͺ© νμμ μλ³νμμμ€. νλ μ μλμ λ λλ§ μκ°μ λΆμνμ¬ λμ λ°μΈλ©μ΄ μ±λ₯μ λ―ΈμΉλ μν₯μ νμΈνμμμ€.
- νΈνμ±: μ½λκ° λ€μν μ₯μΉ λ° λΈλΌμ°μ μ νΈνλλμ§ νμΈνμμμ€. κ°λ₯ν κ²½μ° WebGL 2.0 κΈ°λ₯(μ: UBO) μ¬μ©μ κ³ λ €νκ³ , νμν κ²½μ° κ΅¬ν μ₯μΉλ₯Ό μν λ체 λ°©μμ μ 곡νμμμ€. Three.jsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ μμ€ WebGL μμ μ μΆμννλ κ²μ κ³ λ €νμμμ€.
- κ΅μ°¨ μΆμ² λ¬Έμ : ν μ€μ²λ λ€λ₯Έ μΈλΆ 리μμ€λ₯Ό λ‘λν λ κ΅μ°¨ μΆμ² μ νμ μ μνμμμ€. 리μμ€λ₯Ό μ 곡νλ μλ²λ κ΅μ°¨ μΆμ² μ κ·Όμ νμ©ν΄μΌ ν©λλ€.
- μΆμν: λμ λ°μΈλ©μ 볡μ‘μ±μ μΊ‘μννκΈ° μν΄ ν¬νΌ ν¨μλ ν΄λμ€λ₯Ό λ§λλ κ²μ κ³ λ €νμμμ€. μ΄λ μ½λ κ°λ μ±κ³Ό μ μ§ κ΄λ¦¬μ±μ ν₯μμν΅λλ€.
- λλ²κΉ : WebGL λλ²κΉ νμ₯ νλ‘κ·Έλ¨μ μ¬μ©νμ¬ μ °μ΄λ μΆλ ₯μ κ²μ¦νλ κ²κ³Ό κ°μ λλ²κΉ κΈ°μ μ μ¬μ©νμμμ€.
μ μΈκ³μ μν₯ λ° μ€μ μ μ© μ¬λ‘
μ΄ κΈμμ λ Όμλ κΈ°μ λ€μ μ μΈκ³ μΉ κ·Έλν½μ€ κ°λ°μ κΉμ μν₯μ λ―ΈμΉ©λλ€. λ€μμ λͺ κ°μ§ μ€μ μ μ© μ¬λ‘μ λλ€:
- λνν μΉ μ ν리μΌμ΄μ : μ μμκ±°λ νλ«νΌμ μ ν μκ°νλ₯Ό μν΄ λμ λ°μΈλ©μ νμ©νμ¬ μ¬μ©μκ° μ€μκ°μΌλ‘ λ€μν μ¬μ§, μμ λ° ν μ€μ²λ‘ νλͺ©μ μ¬μ©μ μ μνκ³ λ―Έλ¦¬ λ³Ό μ μλλ‘ ν©λλ€.
- λ°μ΄ν° μκ°ν: κ³Όν λ° μμ§λμ΄λ§ μ ν리μΌμ΄μ μ 볡μ‘ν λ°μ΄ν° μΈνΈλ₯Ό μκ°ννκΈ° μν΄ λμ λ°μΈλ©μ μ¬μ©νμ¬ μ§μμ μΌλ‘ μ λ°μ΄νΈλλ μ 보μ ν¨κ» λνν 3D λͺ¨λΈμ νμν μ μμ΅λλ€.
- κ²μ κ°λ°: μΉ κΈ°λ° κ²μμ ν μ€μ² κ΄λ¦¬, 볡μ‘ν μκ° ν¨κ³Ό μμ± λ° μ¬μ©μ νλμ μ μνκΈ° μν΄ λμ λ°μΈλ©μ μ¬μ©ν©λλ€.
- κ°μ νμ€(VR) λ° μ¦κ° νμ€(AR): λμ λ°μΈλ©μ λ€μν μμ°κ³Ό λνν μμλ₯Ό ν΅ν©νμ¬ λ§€μ° μμΈν VR/AR κ²½νμ λ λλ§ν μ μκ² ν©λλ€.
- μΉ κΈ°λ° λμμΈ λꡬ: λμμΈ νλ«νΌμ μ΄λ¬ν κΈ°μ μ νμ©νμ¬ λ°μμ±μ΄ λ°μ΄λκ³ μ¬μ©μκ° μ¦κ°μ μΈ νΌλλ°±μ λ³Ό μ μλ 3D λͺ¨λΈλ§ λ° λμμΈ νκ²½μ ꡬμΆν©λλ€.
μ΄λ¬ν μ ν리μΌμ΄μ λ€μ μ μΈκ³ λ€μν μ°μ μμ νμ μ μ£Όλνλ WebGL μ °μ΄λ μ λνΌ λμ λ°μΈλ©μ λ€μ¬λ€λ₯ν¨κ³Ό κ°λ ₯ν¨μ 보μ¬μ€λλ€. λ°νμμ λ λλ§ λ§€κ°λ³μλ₯Ό μ‘°μν μ μλ λ₯λ ₯μ κ°λ°μλ€μ΄ λ§€λ ₯μ μ΄κ³ λννμΈ μΉ κ²½νμ λ§λ€κ³ , μ¬μ©μλ₯Ό μ°Έμ¬μν€λ©°, μλ§μ λΆμΌμμ μκ°μ λ°μ μ μ΄λλλ‘ νμ μ€μ΄μ€λλ€.
κ²°λ‘ : λμ λ°μΈλ©μ νμ λ°μλ€μ΄κΈ°
WebGL μ °μ΄λ μ λνΌ λμ λ°μΈλ©μ νλ μΉ κ·Έλν½μ€ κ°λ°μ κΈ°λ³Έ κ°λ μ λλ€. κΈ°λ³Έ μ리λ₯Ό μ΄ν΄νκ³ WebGL 2.0μ κΈ°λ₯μ νμ©ν¨μΌλ‘μ¨ κ°λ°μλ€μ μΉ μ ν리μΌμ΄μ μμ μλ‘μ΄ μμ€μ μ μ°μ±, ν¨μ¨μ± λ° μκ°μ νλΆν¨μ μ»μ μ μμ΅λλ€. ν μ€μ² κ΅μ²΄μμ κ³ κΈ λ©ν° ν μ€μ²λ§μ μ΄λ₯΄κΈ°κΉμ§, λμ λ°μΈλ©μ μ μΈκ³ κ΄κ°μ μν λννμ΄κ³ λ§€λ ₯μ μ΄λ©° κ³ μ±λ₯μ κ·Έλν½ κ²½νμ λ§λλ λ° νμν λꡬλ₯Ό μ 곡ν©λλ€. μΉ κΈ°μ μ΄ κ³μ λ°μ ν¨μ λ°λΌ, μ΄λ¬ν κΈ°μ μ λ°μλ€μ΄λ κ²μ μΉ κΈ°λ° 3D λ° 2D κ·Έλν½ μμμμ νμ μ μ λμ μκΈ° μν΄ λ§€μ° μ€μν κ²μ λλ€.
μ΄ κ°μ΄λλ WebGL μ °μ΄λ μ λνΌ λμ λ°μΈλ©μ λ§μ€ν°νκΈ° μν κ²¬κ³ ν κΈ°λ°μ μ 곡ν©λλ€. μΉ κ·Έλν½μ€μμ κ°λ₯ν κ²μ κ²½κ³λ₯Ό λνκΈ° μν΄ μ€ννκ³ , νμνκ³ , μ§μμ μΌλ‘ λ°°μ°λ κ²μ μμ§ λ§μμμ€.