WebGLì OpenGL íì¤ê³¼ë ë¤ë¥´ê² ìì²´ì ì¸ ì¡°ëª í¨ê³¼ë¥¼ ì ê³µíì§ ììµëë¤. ë°ë¼ì WebGLììì ì¡°ëª í¨ê³¼ë ê°ë°ì ì¤ì¤ë¡ ë§ë¤ì´ì¼ í©ëë¤. ë¤íì¤ë½ê²ë ì¡°ëª í¨ê³¼ë¥¼ ë§ëë ê²ì´ ì주 ì´ë ¤ì´ ì¼ì ìëë©°, ì´ ê¸ì íµí´ ëª ê°ì§ 기ì´ì ì¸ ë¶ë¶ì ì´í´í ì ìì ê²ì ëë¤.
3Dììì ì¡°ëª ì뮬ë ì´ì ê³¼ ëª ì í¨ê³¼3D ê·¸ëí½ì ì¡°ëª ì뮬ë ì´ì ì ëí ì´ë¡ ì ë°íì ëí´ ìì¸íê² ììë³´ë ê²ì ì´ ê¸ì ë²ì를 ë§ì´ ë²ì´ëë¤ê³ í ì ìì§ë§, ê·¸ ëì ì리ì ëí´ìë ì¡°ê¸ì´ëë§ ììë³¼ íìê° ììµëë¤. 먼ì ê°ì¥ ë리 ì¬ì©ëë ì¡°ëª ëª¨ë¸ì¸ í ì °ì´ë©(Phong shading)ì ëí ìí¤í¼ëì ìë£ë¥¼ í ë² ì½ì´ë³´ì기 ë°ëëë¤.
ì¡°ëª ìë ì¸ ê°ì§ 기본 íì ì´ ììµëë¤:
주ë³ê´(Ambient light)ì ì¥ë©´(scene) ì ë°ì ê±¸ì³ ì¤ë©°ëë ë¹ì¼ë¡, ë°©í¥ì±ì´ ìì¼ë©° ì¥ë©´ ë´ì ìë 모ë íë©´ì ê·¸ íë©´ì ë°©í¥ê³¼ ê´ê³ìì´ ëì¼í ë°ê¸°ë¡ ë¹ì¶°ì¤ëë¤.
ë°©í¥ê´(Directional light)ì í¹ì í ë°©í¥ì¼ë¡ë§ ë¹ì¶°ì§ë ë¹ì ëë¤. ë°©í¥ê´ì ì주 먼 ê³³ìì ë¹ì¶°ì§ê¸° ë문ì 모ë ë¹ ì ì(photon, ê´ì)ê° ìë¡ ííí ë°©í¥ì¼ë¡ ìì§ì ëë¤. ë°©í¥ê´ì ëíì ì¸ ìë ë°ë¡ íìê´ì ëë¤.
ì ê´(Point light)ì í ì§ì ìì 모ë ë°©í¥ì¼ë¡ í¼ì§ë©´ì ë°ì°íë ë¹ì ëë¤. ì¤ìíìì ì í ì ìë ëë¶ë¶ì ë¹ì´ ì´ ì ê´ì í´ë¹í©ëë¤. ì 구ìì ëì¤ë ë¹ì´ ì ê´ì ëíì ì¸ ìë¼ê³ í ì ìê² ìµëë¤.
ì´ ê¸ììë ë°ì¬ê´ íì´ë¼ì´í¸(specular highlight)ë ì ê´ìì ëí´ìë ë¤ë£¨ì§ ìê³ , ë¨ìí ë°©í¥ê´ ì¡°ëª ê³¼ 주ë³ê´ ì¡°ëª ë§ ìì ë³´ê² ìµëë¤. 주ë³ê´ì ë°©í¥ê´ì(directional light source)ì ëí ì¡°ëª í¨ê³¼ë¥¼ ì ë¨ìì ìì ì ìë íì íë ì ì¡ë©´ì²´ì ì ì©í´ë³´ê² ìµëë¤.
ì ê´ìì´ë ë°ì¬ê´ì ê³ ë ¤íì§ ìëë¤ë©´, ë°©í¥ê´ ì¡°ëª ì 구íí기 ìí ì ë³´ë í¬ê² ë ê°ì§ê° ììµëë¤:
ì ë ê°ì§ ì 보를 구íê³ ëë©´, ë°©í¥ê´ì ë°©í¥ê³¼ ì ì¡ë©´ì²´ì íë©´ì´ ë§ëë ê°ëì ë°ë¼ ë¬ë¼ì§ë ë°©í¥ê´ ì¡°ëª í¨ê³¼ì 모ë íë©´ì ê· ì¼íê² ì ì©ëë 주ë³ê´ ì¡°ëª í¨ê³¼ë¥¼ ë°ìí´ì ê° ì ì ì ììì ì¡°ì í ì ìëë¡ ì ì ì °ì´ë를 ìì í´ì¼ í©ëë¤. ì °ì´ë ì½ë를 ì´ë»ê² ìì íëì§ë ì¡°ê¸ ì´ë°ê° ì´í´ë³´ê¸°ë¡ íê³ , 먼ì ì ì ì ë²ì 벡í°ë¥¼ ë§ëë ë°©ë²ë¶í° ììë³´ê² ìµëë¤.
ì ì ë³ ë²ì 구ì±ì¡°ëª í¨ê³¼ ì ì©ì ìí´ ì²«ë²ì§¸ë¡ í´ì¼í ì¼ì ì ì¡ë©´ì²´ë¥¼ ì´ë£¨ë 모ë ì ì ì ë²ì ë°°ì´ì 구ì±íë ê²ì ëë¤. ì ì¡ë©´ì²´ë ì주 ë¨ìí ê°ì²´ì´ë¯ë¡ ì ì¡ë©´ì²´ì ë²ì ë°°ì´ ìì ì½ê² ë§ë¤ ì ììµëë¤. íì§ë§ ë³µì¡íê² ì긴 ê°ì²´ì ë²ì ì ê³ì°íë ê²ì ìë¹í ì´ë µìµëë¤.
cubeVerticesNormalBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesNormalBuffer);
var vertexNormals = [
// ì
0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,
// ë¤
0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0,
// ì
0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
// ìë
0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0,
// ì¤ë¥¸ìª½
1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
// ì¼ìª½
-1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0,
];
gl.bufferData(
gl.ARRAY_BUFFER,
new WebGLFloatArray(vertexNormals),
gl.STATIC_DRAW,
);
ì´ë° ë°°ì´ì ì²ë¦¬ë ì ë¨ììì ì¬ë¬ ë² ë¤ë¤ìì¼ë¯ë¡ ì´ì 꽤 ì¹ìí´ ë³´ì¼ ê²ì
ëë¤. ìë¡ì´ ë²í¼ë¥¼ ìì±íê³ , ë²í¼ì ë²ì ë°°ì´ì ë°ì¸ë©íê³ , bufferData()
를 í¸ì¶í´ì ë²ì ë°°ì´ì ë²í¼ì ì ë¬í©ëë¤.
ê·¸ ë¤ìì ë²ì ë°°ì´ê³¼ ì
°ì´ë attribute ë³ìì ë°ì¸ë©í´ì ì
°ì´ëê° ë²ì ë°°ì´ ì ë³´ì ì ê·¼í ì ìëë¡ í´ì£¼ë ì½ë를 drawScene()
ì ì¶ê°í©ëë¤:
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesNormalBuffer);
gl.vertexAttribPointer(vertexNormalAttribute, 3, gl.FLOAT, false, 0, 0);
ë§ì§ë§ì¼ë¡ uniform íë ¬ì 구ì±íë setMatrixUniforms()
ì ë²ì íë ¬ì ë§ë¤ê³ ì
°ì´ëìê² ì ë¬íë ì½ë를 ì¶ê°í©ëë¤. ë²ì íë ¬ì ê´ìì 기ì¤ì¼ë¡ ì ì¡ë©´ì²´ì ìëì ì¸ ë°©í¥ì ë°ë¼ ë²ì ì ë³ííë ë° ì¬ì©ë©ëë¤:
var normalMatrix = mvMatrix.inverse();
normalMatrix = normalMatrix.transpose();
var nUniform = gl.getUniformLocation(shaderProgram, "uNormalMatrix");
gl.uniformMatrix4fv(
nUniform,
false,
new WebGLFloatArray(normalMatrix.flatten()),
);
ì
°ì´ë ìì
ì¡°ëª í¨ê³¼ 구íì ìí´ ì °ì´ëê° íìë¡ íë ë°ì´í°ê° 모ë ì¤ë¹ëìì¼ë¯ë¡, ì´ì ì °ì´ë ì½ë를 ìì í´ë³´ê² ìµëë¤.
ì ì ì °ì´ëì ì¼ ë¨¼ì ë°©í¥ê´ ì¡°ëª ê³¼ 주ë³ê´ ì¡°ëª ì ìí ê° ì ì ì ëª ì ê°ì ê³ì°í´ì¼ í©ëë¤. ì¼ë¨ ìì¤ ì½ëë¶í° ë³´ê² ìµëë¤:
<script id="shader-vs" type="x-shader/x-vertex">
attribute highp vec3 aVertexNormal;
attribute highp vec3 aVertexPosition;
attribute highp vec2 aTextureCoord;
uniform highp mat4 uNormalMatrix;
uniform highp mat4 uMVMatrix;
uniform highp mat4 uPMatrix;
varying highp vec2 vTextureCoord;
varying highp vec3 vLighting;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
vTextureCoord = aTextureCoord;
// ì¡°ëª
í¨ê³¼ ì ì©
highp vec3 ambientLight = vec3(0.6, 0.6, 0.6);
highp vec3 directionalLightColor = vec3(0.5, 0.5, 0.75);
highp vec3 directionalVector = vec3(0.85, 0.8, 0.75);
highp vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0);
highp float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0);
vLighting = ambientLight + (directionalLightColor * directional);
}
</script>
ì ì ì ìì¹ ê³ì°ì´ ëëê³ , ì ì ì í ì (texel) ì¢íê°ì ì»ê³ ëë©´, ê·¸ ê°ì 기ì¤ì¼ë¡ ì ì ì ëª ìì ê³ì°í ì ììµëë¤.
ì ì ì ëª ìì ê³ì°íë ¤ë©´ 먼ì ì ì¡ë©´ì²´ì íì¬ ìì¹ì ë°©í¥ì 기ì¤ì¼ë¡ ë²ì ì ë³íí´ì¼ í©ëë¤. ì ì ì ë²ì ì ë²ì íë ¬ì ê³±íë©´ ë²ì ì´ ë³íë©ëë¤. ê·¸ ë¤ìì ë³íë ë²ì ê³¼ ë°©í¥ ë²¡í°(ê´ìì¼ë¡ë¶í° ë¹ì´ ë¹ì¶°ì§ë ë°©í¥)를 ë´ì (dot product)íë©´ ì ì ì ë¹ì¶°ì§ë ë°©í¥ê´ì ìì ê³ì°í ì ììµëë¤. ë¹ì ìì´ ììì¼ ìë ìì¼ë¯ë¡, ê³ì°ë ë°©í¥ê´ì ìì´ ììì¼ ëë ë°©í¥ê´ì ìì 0ì¼ë¡ ì¤ì í´ì¤ëë¤.
ë°©í¥ê´ì ìì ê³ì°íê³ ëë©´, ë°©í¥ê´ì ììê³¼ ë°©í¥ê´ì ìì ê³±í ê°ì 주ë³ê´ì ê°ì ëí´ì ì ì ì ë¹ì¶°ì§ë ìµì¢ ë¹ì ìì 구í ì ììµëë¤. ê²°ê³¼ì ì¼ë¡ RGBê°ì´ ëì¤ëë°, ì´ RGBê°ì íëê·¸ë¨¼í¸ ì °ì´ëê° ì°ë¦¬ê° 그릴 모ë í½ì ì ëí ììê°ì ê³ì°íëë° ì¬ì©ë©ëë¤.
íëê·¸ë¨¼í¸ ì °ì´ëì´ì ì ì ì °ì´ëìì ê³ì°í ë¹ì ìì ë°ìí´ì ì¡°ëª í¨ê³¼ë¥¼ ííí ì ìëë¡ íëê·¸ë¨¼í¸ ì °ì´ë를 ìì í´ì¼ í©ëë¤:
<script id="shader-fs" type="x-shader/x-fragment">
varying highp vec2 vTextureCoord;
varying highp vec3 vLighting;
uniform sampler2D uSampler;
void main(void) {
mediump vec4 texelColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
gl_FragColor = vec4(texelColor.rgb * vLighting, texelColor.a);
}
</script>
ì ë¨ìì ìì ìì íë ê²ì²ë¼ í ì ì ììê°ì ê³ì°í©ëë¤. íì§ë§ ì´ë²ìë í ì ì ììê°ì ë°ë¡ íë그먼í¸ì ììê°ì¼ë¡ ì¤ì íì§ ìê³ , ì¡°ëª í¨ê³¼ë¥¼ ííí ì ìëë¡ í ì ì ììê°ì ë¹ì ìì ê³±í ê°ì íë그먼í¸ì ììê°ì¼ë¡ ì¤ì í©ëë¤.
ì ì´ì ë¤ ìì±íìµëë¤! WebGLì ì§ìíë ë¸ë¼ì°ì ë¼ë©´ ì¬ê¸°ìì ì¤ì ëìíë ìì 를 íì¸í ì ììµëë¤.
ì°ìµí´ë³´ê¸°ìë¤ìí¼ ì´ë² ìì ë ì ì ë¨ìì 기본ì ì¸ ì¡°ëª í¨ê³¼ë¥¼ 구íí ë¨ìí ìì ì ëë¤. ë ìì¤ ëì ì»´í¨í° ê·¸ëí½ì ë§ë¤ë ¤ë©´ ì ì ë¨ìê° ìëë¼ í½ì ë¨ìì ì¡°ëª í¨ê³¼ê° íìí ê²ì ëë¤. íì§ë§ ì ì ë¨ìì ì¡°ëª í¨ê³¼ë¥¼ ë¤ë£¬ ì´ ê¸ì´ ê³ ê¸ ê·¸ëí½ì ë§ëëë° ëìì´ ë ê²ì ëë¤.
ë¹ì ë°©í¥ì´ë ê´ìì ìì ë±ì ë¤ë¥¸ ê°ì¼ë¡ ë°ê¿ë³´ë ë± ë¤ìíê² ì¤íí´ë³´ë ê²ë ì¡°ëª í¨ê³¼ë¥¼ ì´í´íëë° ëìì´ ë ê²ì ëë¤.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4