ì ë¨ìì ìì ìì íì íë 3ì°¨ì ì ì¡ë©´ì²´ë¥¼ ë§ë¤ì´ë´¤ìµëë¤. ì´ë²ìë ì ì¡ë©´ì²´ì ê° ë©´ì ë¨ìì¼ë¡ ìì ì¹ íë ëì ì í ì¤ì³ë¥¼ ì í ë³´ê² ìµëë¤.
í ì¤ì³ ë¡ë©ê°ì¥ 먼ì í´ì¼í ì¼ì í ì¤ì³ë¥¼ ì½ì´ì¤ë ê²ì ëë¤. ì´ë² ìì ììë ëì¼í íëì í ì¤ì³ë¥¼ íì íë ì ì¡ë©´ì²´ì 6ê°ì ë©´ì ì íë³¼ ê²ì ëë¤. ì¬ë¬ê°ì í ì¤ì³ë¥¼ ê° ë©´ì ì íë¤ê³ í´ë íë를 ì íë ê²ê³¼ ëì¼í ë°©ë²ì ì ì©íë©´ ë©ëë¤.
ì°¸ê³ : í ì¤ì³ë¥¼ ì¸ë¶ìì ì½ì´ì¬ ëë í¬ë¡ì¤ ëë©ì¸ ê·ì¹(cross-domain rules)ì ì ìí´ì¼ í©ëë¤. CORS(Cross Origin Resource Sharing)ì¹ì¸ì ë°ì ì ìë ëë©ì¸ì ìë í ì¤ì³ë§ ì½ì´ì¬ ì ììµëë¤. ìì¸í ë´ì©ì í¬ë¡ì¤ ëë©ì¸ í ì¤ì³(Cross-domain textures)를 ì°¸ê³ íì¸ì.
í ì¤ì³ë¥¼ ì½ì´ì¤ë ì½ëë ë¤ìê³¼ ê°ìµëë¤:
function initTextures() {
cubeTexture = gl.createTexture();
cubeImage = new Image();
cubeImage.onload = function () {
handleTextureLoaded(cubeImage, cubeTexture);
};
cubeImage.src = "cubetexture.png";
}
function handleTextureLoaded(image, texture) {
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(
gl.TEXTURE_2D,
gl.TEXTURE_MIN_FILTER,
gl.LINEAR_MIPMAP_NEAREST,
);
gl.generateMipmap(gl.TEXTURE_2D);
gl.bindTexture(gl.TEXTURE_2D, null);
}
initTextures()
루í´ì GLì createTexture()
í¨ì를 í¸ì¶í´ì GLì í
ì¤ì³ ê°ì²´ì¸ cubeTexture
를 ìì±íë ê±¸ë¡ ììë©ëë¤. ê·¸ë¦¬ê³ Image
ê°ì²´ë¥¼ ìì±í´ì í
ì¤ì³ë¡ ì¬ì©í기 ìí´ ë¡ë©í ì´ë¯¸ì§ íì¼ì Image
ê°ì²´ì ì ì¥í©ëë¤. handleTextureLoaded()
ì½ë°± 루í´ì ì´ë¯¸ì§ ë¡ë©ì´ ìë£ëë©´ ì¤íë©ëë¤.
í
ì¤ì³ë¥¼ ì¤ì§ì ì¼ë¡ ìì±íë ¤ë©´, ììì ìë¡ ìì±í í
ì¤ì³ ê°ì²´ë¥¼ gl.TEXTURE_2D
ì ë°ì¸ë©í´ì¼ í©ëë¤. ê·¸ë¦¬ê³ ëì ì´ë¯¸ì§ ë°ì´í°ê° ë¡ë©ë ì´ë¯¸ì§ ê°ì²´ë¥¼ texImage2D()
ì ì ë¬íì¬ í¸ì¶íë©´, ì´ë¯¸ì§ ë°ì´í°ê° í
ì¤ì³ì ì°ì¬(write) ì§ëë¤.
ì°¸ê³ : í ì¤ì³ì ëë¹ì ëì´ë ê±°ì ëë¶ë¶ì ìí©ìì 2ì ê±°ëì ê³± í½ì (1, 2, 4, 8, 16, 32, ...)ì´ì´ì¼ í©ëë¤. ìì¸ì¸ ê²½ì°ì ëí´ìë ìëì "í¬ê¸°ê° 2ì ê±°ëì ê³± í½ì ì´ ìë í ì¤ì³"를 ì°¸ê³ íì¸ì.
ê·¸ ë¤ì ë ë¼ì¸ì í ì¤ì³ë¥¼ ìí íí°ë§ì ì¤ë¹í©ëë¤. ì´ íí°ë§ì ì´ë¯¸ì§ í¬ê¸°ê° ë³ê²½ë ë ì´ë¯¸ì§ê° íí°ëë ë°©ìì ì ì´í©ëë¤. ì¬ê¸°ììë ì´ë¯¸ì§ë¥¼ íëí ë ì í íí°ë§ì ì¬ì©íê³ , ì´ë¯¸ì§ë¥¼ ì¶ìí ë mipmapì ì¬ì©í©ëë¤. generateMipMap()ì í¸ì¶í´ì mipmapì´ ë§ë¤ì´ì§ë©´ gl.TEXTURE_2Dì nullì ë°ì¸ë©ìì¼ì, í ì¤ì³ë¥¼ ë¤ë£° ì¤ë¹ê° ëë¬ë¤ë ê²ì WebGLìê² ìë ¤ì¤ëë¤.
í¬ê¸°ê° 2ì ê±°ëì ê³±ì´ ìë í ì¤ì³ì¼ë°ì ì¼ë¡ ëë¹ì ëì´ê° 2ì ê±°ëì ê³±ì¸ í ì¤ì³ë¥¼ ì¬ì©íë ê²ì´ ê°ì¥ ì´ìì ì ëë¤. ìëíë©´ 2ì ê±°ëì ê³±ì¸ í ì¤ì³ë ë¹ëì¤ ë©ëª¨ë¦¬ì í¨ì¨ì ì¼ë¡ ì ì¥ë ì ìê³ , ì´ë¤ ë°©ìì¼ë¡ ì¬ì©ëì´ì¼ë§ íë¤ë ì ì½ì´ ì기 ë문ì ëë¤. ìì ê°ë¤ì´ ì´ë¯¸ ìì±í í ì¤ì³ë ëë¹ì ëì´ê° 2ì ê±°ëì ê³±ì´ ëëë¡ í¬ê¸°ë¥¼ ë§ì¶°ì¤ì¼ íë©°, ê°ë¥íë¤ë©´ ìì ë§ë¤ëë¶í° 2ì ê±°ëì ê³±ì¼ë¡ ë§ëë ê²ì´ ì¢ìµëë¤. ëë¹ì ëì´ë 2ì ê±°ëì ê³±ì¸ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, ëë 2048 í½ì ì´ì´ì¼ í©ëë¤. ì ë¶ë ìëì§ë§ ë§ì ëë°ì´ì¤ê° 4096 í½ì ë ì§ìíê³ ìì¼ë©°, ì´ë¤ ëë°ì´ì¤ë 8192 í½ì ì´ìì ì§ìí기ë í©ëë¤.
2ì ê±°ëì ê³±ì¸ í ì¤ì³ë¥¼ ì¬ì©í기 곤ëí ìí©ë ìì ì ììµëë¤. í ì¤ì³ì ìì¤ê° ëë ì´ë¯¸ì§ë¥¼ ì¨ëíí°ìì 구í ê²ì´ë¼ë©´, WebGLì ì ë¬í기 ì ì HTML5 ìºë²ì¤ë¥¼ ì´ì©í´ì ì´ë¯¸ì§ í¬ê¸°ë¥¼ 2ì ê±°ëì ê³±ì¼ë¡ ìì íë ê²ì´ ì¢ìµëë¤. ì´ ë UV ì¢íê°ë í¨ê» ì¡°ì í´ì¼ í©ëë¤.
2ì ê±°ëì ê³±ì´ ìë(NPOT, Non Power Of Two) í ì¤ì³ë¥¼ ê¼ ì¨ì¼ë§ íë ìí©ë ìì ê²ì ëë¤. WebGLì NPOT í ì¤ì³ë ì íì ì¼ë¡ ì§ìí©ëë¤. í ì¤ì³ì í¬ê¸°ê° 모ëí° í´ìëì ëê°ìì¼ë§ íë¤ê±°ë, ìì ë¨ë½ìì ì¸ê¸í ê²ì²ë¼ 2ì ê±°ëì ê³±ì¼ë¡ ìì íë ì¼ì´ ë¨ìí ê·ì°®ì ëë NPOT í ì¤ì³ê° ì ì©í ì ììµëë¤. íì§ë§ NPOT í ì¤ì³ìë ì ì½ ì¬íì´ ììµëë¤. NPOT í ì¤ì³ë mipmappingì í ì ìì¼ë©°, íì¼(tile) ëë ê°ì¸ê¸°(wrap) ì²ë¼ "ë°ë³µ"íë ë°©ìì¼ë¡ ì¬ì©í ì ììµëë¤.
ëª ê°ì ë²½ë ì´ë¯¸ì§ë¥¼ íì¼ë§ í´ì ë²½ëë¡ ë ë²½ì ë§ëë ê²ì´ í ì¤ì³ ë°ë³µì í ì¬ë¡ ì ëë¤.
bindTexture()
를 ì´ì©í´ì í
ì¤ì³ë¥¼ ìì±í ë, texParameteri()
ë©ìëë¡ mipmappingê³¼ UV ë°ë³µì ë¹íì±í ìí¬ ì ììµëë¤. ì´ ë¹íì±í를 íµí´ mipmapping, UV ê°ì¸ê¸°, UV íì¼ë§ì í¬ê¸°íê³ , ëë°ì´ì¤ê° í
ì¤ì³ë¥¼ ì´ë»ê² ì²ë¦¬í ì§ ê²°ì í ì ìë ì ì´ê¶ë í¬ê¸°íë ëì NPOT í
ì¤ì³ë¥¼ ì¬ì©í ì ìê² ë©ëë¤.
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); //gl.LINEAR ëì ì gl.NEARESTë íì©ëì§ë§, ë ë¤ mipmap ë ì ìë¤.
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); //sì¢íê³ ê°ì¸ê¸°(ë°ë³µ) ë°©ì§
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); //tì¢íê³ ê°ì¸ê¸°(ë°ë³µ) ë°©ì§
texParameteri()
ë©ìëì ìì ê°ì íë¼ë¯¸í°ë¥¼ ì ë¬í¨ì¼ë¡ì¨, WebGLì ì§ìíë ëë°ì´ì¤ë ì´ë¤ í´ìëì í
ì¤ì³ë ì²ë¦¬í ì ìë ìµëíì í´ìëê¹ì§ ìëì¼ë¡ ì²ë¦¬í ì ìê² ë©ëë¤. ìì ê°ì ì¤ì ì í´ì£¼ì§ ìì¼ë©´ WebGLì NPOT í
ì¤ì³ë¥¼ ì²ë¦¬íì§ ëª»íê³ rgba(0, 0, 0, 1)
ì¸ ê²ììì ë°íí©ëë¤.
ì´ì í
ì¤ì³ ì½ì´ì¤ê¸°ë ìë£ëìê³ , í
ì¤ì³ë ì¬ì©í ì¤ë¹ê° ëì´ ììµëë¤. íì§ë§ í
ì¤ì³ë¥¼ ì¬ì©í기 ì ì í
ì¤ì³ì ì¢íì ì ì¡ë©´ì²´ì ë©´ì ì ì ì 매í ìì¼ì¤ì¼ í©ëë¤. ì´ë¥¼ ìí´ initBuffers()
í¨ì ìì ìë ì ì¡ë©´ì²´ ê° ë©´ì ììì ì¤ì íë ë´ì©ì 모ë ìëì ê°ì ì½ëë¡ ëì²´í©ëë¤.
cubeVerticesTextureCoordBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesTextureCoordBuffer);
var textureCoordinates = [
// ì
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// ë¤
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// ì
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// ìë
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// ì¤ë¥¸ìª½
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
// ì¼ìª½
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
];
gl.bufferData(
gl.ARRAY_BUFFER,
new WebGLFloatArray(textureCoordinates),
gl.STATIC_DRAW,
);
먼ì ê° ë©´ì í ì¤ì³ ì¢í를 ì ì¥í GL ë²í¼ë¥¼ ìì±íê³ , í ì¤ì³ ì¢í ë°°ì´ì ë°ì¸ë© í©ëë¤.
textureCoordinates
ë°°ì´ì ì ì¡ë©´ì²´ ê° ë©´ì ì ì ì í´ë¹íë í
ì¤ì³ ì¢í를 ì ìí©ëë¤. í
ì¤ì³ ì¢íê°ì ë²ìë 0.0 ìì 1.0 ì¬ì´ë¼ë ì ì 기ìµí´ 주ììì¤. í
ì¤ì³ ì¢íì ëë¹ê°ê³¼ ëì´ê°ì ì¤ì ëë¹ê°ì´ë ëì´ê°ê³¼ ê´ê³ ìì´ ì¸ì ë 0.0 ìì 1.0 ì¬ì´ì ê°ì¼ë¡ ì ê·í(normalize) ë©ëë¤.
í ì¤ì³ 매í ë°°ì´ ì¤ì ì´ ëëê³ ë°°ì´ì ë²í¼ì ì ë¬íë©´ GLì´ í ì¤ì³ ë°ì´í°ë¥¼ ì¬ì©í ì ìê² ë©ëë¤.
ì°¸ê³ : Note: WebKit 기ë°ì ë¸ë¼ì°ì ììë WebGLFloatArray
ëì ì Float32Array를 ì¬ì©í´ì¼ í©ëë¤.
ì °ì´ë íë¡ê·¸ë¨ê³¼ ì °ì´ë를 ì´ê¸°ííë ì½ëë¤ë ë¨ì ìì ëì í ì¤ì³ë¥¼ ì¬ì©í ì ìëë¡ ìì í´ì¼ í©ëë¤.
먼ì initShaders()
ìì ìë ì주 ë¨ìí ë³ê²½ ì¬íì ìì ë´
ìë¤:
textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");
gl.enableVertexAttribArray(textureCoordAttribute);
ì ì ì»¬ë¬ attribute ë³ì를 ì¤ì íë ì½ëê°, ê° ì ì ì í ì¤ì³ ì¢íê°ì ì¤ì íë ì½ëë¡ ëì²´ ëììµëë¤.
ì ì ì °ì´ëë¤ìì¼ë¡ ìì ë°ì´í°ë¥¼ ì½ì´ì¤ë ì ì ì °ì´ë를 í ì¤ì³ ì¢í를 ì½ì´ì¤ëë¡ ìì í´ì¼ í©ëë¤.
<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 aVertexPosition;
attribute vec2 aTextureCoord;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying highp vec2 vTextureCoord;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
vTextureCoord = aTextureCoord;
}
</script>
ì ì ìì ì 보를 ì½ì´ì¤ë ëì ì í ì¤ì³ ì¢íê°ì ì½ì´ìì ì¤ì íë¤ë ì ì´ í¤ í¬ì¸í¸ ì ëë¤. ìì ê°ì´ ì ì ê³¼ í ì¤ì³ ì¢íê°ì 매ííë©´, ê° ì ì ì´ í ì¤ì³ì ì´ë ì§ì ì í´ë¹ íëì§ ìë ¤ì¤ ì ììµëë¤.
íëê·¸ë¨¼í¸ ì °ì´ëë§ì°¬ê°ì§ë¡ íëê·¸ë¨¼í¸ ì °ì´ëë ìì í´ì¼ í©ëë¤:
<script id="shader-fs" type="x-shader/x-fragment">
varying highp vec2 vTextureCoord;
uniform sampler2D uSampler;
void main(void) {
gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
}
</script>
ì´ë ê² íë©´ íë그먼í¸ì ììì ì í기 ìí´ ì§ì íë그먼í¸ì ììê°ì í ë¹íì§ ìê³ , ìíë¬(sampler)ê° íë¨í기ì íë그먼í¸ì ìì¹ì ê°ì¥ ì ë§ì ë¨ì´ì§ë¤ê³ ì¬ê²¨ì§ë í ì (texel, í ì¤ì³ ë´ë¶ì ìë í½ì )ê°ì ë°ë¼ì íë그먼í¸ì ììê°ì ê³ì°í´ë ëë¤.
í ì¤ì³ë¥¼ ì í ì ì¡ë©´ì²´ 그리기í ì¤ì³ë¥¼ ì í ìí를 ë ëª ííê² íì¸í ì ìëë¡, ì ë¨ìì ìì ì í¬í¨ëì´ ìë ì ì¡ë©´ì²´ì ì´ëì ì ê±°í ê²ì ì ì¸íë©´ drawScene() í¨ìì ìì ì ê°ë¨í©ëë¤.
ì ì ì ììì 매ííë ì½ë를 ë¤ìê³¼ ê°ì´ ë©´ì í ì¤ì³ë¥¼ 매ííë ì½ëë¡ ëì²´í©ëë¤:
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, cubeTexture);
gl.uniform1i(gl.getUniformLocation(shaderProgram, "uSampler"), 0);
GLì 32ê°ì í
ì¤ì³ ë ì§ì¤í°ë¥¼ ì ê³µí©ëë¤. ê·¸ ì¤ ì²«ë²ì§¸ ë ì§ì¤í°ë gl.TEXTURE0
ì
ëë¤. í
ì¤ì³ë¥¼ ì¬ì©í기 ìí´ ì ì ì½ì´ì¨ í
ì¤ì³ë¥¼ gl.TEXTURE0ì ë°ì¸ë©íê³ , ì
°ì´ë ìíë¬ë¥¼ ì
°ì´ë íë¡ê·¸ë¨ì ëª
ìëì´ ìë uSampler
ë¡ ì¤ì í©ëë¤.
ì´ì ì ë¨ìì ìì ë³´ë¤ ë 보기 ì¢ê² íì íë ì ì¡ë©´ì²´ë¥¼ ë³¼ ì ìì ê²ì ëë¤. 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