E D R , A S I H C RSS

WebGL


1. ๊ธฐ๋ณธ ปจ…‰

OpenGL—„œ  •๋ง ‹ค๋ฌด—„œ “ฐ๋Š” ๋ถ€๋ถ„๋งŒ ๋”ฐ๋กœ ๋–ผ–ด๋‚ธ OpenGL ES(Embeded System)˜ Javascript ๊ตฌ˜„ฒดด๋ฉฐ HTML5 Canvas๋ฅผ †ต•ด ๋‚˜ƒ€๋‚œ๋‹ค. ๋”ฐ๋ผ„œ ˆ๋ณดž๊ฐ€ ‰ฝ๊ฒŒ ๋ฐฐšฐ๋Š”๋ฐ— ˆ ด ๋งžถ”–ด ธ žˆง€ •Š๊ณ  ˜คง  „๋ฌธ๊ฐ€๊ฐ€ ๊ตฌ˜„„ •˜๋Š”๋ฐ— ˆ ด ๋งžถ”–ด ธ žˆ๋‹ค.

2. Šนง•

Javascriptž„—๋„ ๋ถˆ๊ตฌ•˜๊ณ  ๋งˆน˜ C”„๋กœ๊ทธ๋ž˜๋ฐ Šคƒ€ผ˜ •จˆ˜๋“คด กดžฌ•œ๋‹ค. WinAPI๊ฐ€ CŠคƒ€ผ˜ OOPด๋“ฏ WebGL ๋˜•œ CŠคƒ€ผ˜ OOPด๋‹ค. ๋ชจ๋“  •จˆ˜๋Š” WebGLcontext๋ผ๋Š” ๊ฐฒด— žˆ๋Š”๋ฐ ๋ณด๋ฉด ๊ทธ๋ƒฅ  ‘๋‘–ด๋ฅผ ๋ถ™ด๋Š” ๋А๋‚Œด๋‹ค.
var gl = canvas.getContext("experimental-webgl");
gl.attachShader(shaderProgram, fragmentShader);  
gl.attachShader(shaderProgram, vertexShader);
œ„˜ ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ‰ด๋” ”„๋กœ๊ทธ๋žจ— fragmentShader™€ vertexShader๋ฅผ Link ‹œ‚ค๋Š” ๊ตฌ๋ฌธธ๋ฐ ฃผฒดธ shaderProgram€ ฒซ๋ฒˆจฐ ธžด๊ณ  gl€ ๊ทธ๋ƒฅ  ‘๋‘–ด ฒ˜๋Ÿผ ๋ณดธ๋‹ค.  € ๊ตฌ๋ฌธ๋งŒ ๊ทธ๋Ÿฐ๊ฒƒด •„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ชจ๋“  •จˆ˜๋“คด  € gl ๊ฐฒด— ๋ถ™–ดžˆ๋‹ค. •˜ง€๋งŒ  •ž‘ glด ฃผฒด๊ฐ€ •„๋‹Œ ๊ฒƒ๋“คด ๋งŽ๋‹ค. ๋”ฐ๋ผ„œ ๋ž˜•‘•œ ๊ฐฒด๋ฅผ ๋งŒ๋“ค–ด “ฐ๋Š” ๊ฒƒด †Žธ•œ๋ฐ –ด„”„๊ฒŒ –ˆ๋‹ค๊ฐ€๋Š” ๋ฌดฒ™ ๊ผฌด๊ฒŒ ๋œ๋‹ค.

ด ๊ด€Šต€ OpenGLด ๊ธฐ๋ณธ œผ๋กœ C๋ผด๋ธŒ๋Ÿฌ๋ฆฌด๋ผ ๊ทธ๋Ÿฐ๋“ฏ •˜๋‹ค. ‹ค œ ๋ž˜•‘„ „–‰•ด๋ณธ๊ฒฐ๊ณผ ๋งˆน˜ MFC๋ฅผ ๋ณด๋Š”๋“ฏ•œ ๋А๋‚Œ„ ๊ฐ••˜๊ฒŒ ๋ฐ›๊ณ  žˆ๋‹ค.

2.1. OpenGL๊ณผ ฐจด 

  • WebGL€ ๊ธฐกด OpenGL๊ณผ ๋‹ค๋ฅด๊ฒŒ ง ‘ ๊ทธ๋ฆฌ๊ธฐ๊ฐ€ ง€›๋˜ง€ •Š๋Š”๋‹ค. ๊ธฐกด˜ glBegin()™€ glEnd()‚ฌด—„œ ๊ฐ’„ ๊ณ„† œผ๋กœ  „๋‹ฌ•˜ˆ˜ —†๊ณ  ˜คง glDrawElement()๋ฅผ †ต•œ ๋ฐฐ—ด„ •œ๊บผ๋ฒˆ—  „๋‹ฌ•˜๋Š” ๊ฒƒ'๋งŒ' ง€›•œ๋‹ค. ˆ๋ณดž๋“ค˜ ฒซ๋‚œ๊ด€ด๋‹ค.
  • ‚ฌ๊ฐ˜•๊ทธ๋ฆฌ๊ธฐ ๋ฐ ๋‹ค๊ฐ˜• ๊ทธ๋ฆฌ๊ธฐ๊ฐ€ ง€›๋˜ง€ •Š๋Š”๋‹ค. ‹ค œ๋กœ ๋‹ค๊ฐ˜• ๊ทธ๋ฆฌ๊ธฐ๋Š” —ฐŠต‹œ—๋งŒ žฃผ “ฐ๊ณ  ‹ค œ ฝ”๋“œ—„œ๋Š” ‚ผ๊ฐ˜•œผ๋กœ ด๋ฃจ–ด„ ๋ชจ๋ธ„ ๊ฐ€ ธ๋‹ค “ฐ๊ธฐ ๋•Œ๋ฌธธ ๊ฒƒœผ๋กœ ๋ณดธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๊ฐ˜•€ ‚ผ๊ฐ˜•˜ ง‘•ฉœผ๋กœ ‘œ˜„• ˆ˜ žˆ๋‹ค.
  • œ ‹ธ๋ผด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ  œ๊ณต๋˜๋Š” ๋ธŒ, ๊ตฌ, ‹ค๋ฆฐ๋”, ‹ฐฌŠธ๊ฐ€ ๋ชจ๋‘ ง€›๋˜ง€ •Š๋Š”๋‹ค. —ญ‹œ ˜ˆ œ—๋งŒ “ฐด๊ณ  “ฐง€ •Š๊ธฐ ๋•Œ๋ฌธ— ๊ณผ๊ฐžˆ  œ๊•œ๊ฒƒœผ๋กœ ๋ณดธ๋‹ค.
  • ๊ด‘›, นด๋ฉ”๋ผ กฐž‘, šŒ „ ๋“ด  œ๊ณต๋˜ง€ •Š๋Š”๋‹ค. ๋ชจ๋‘ ž‹ ด ง ‘ —ฐ‚ฐ„ †ต•ด –‰๋ ฌ„ ๊ตฌ•ดฃผ–ด•ผ •œ๋‹ค. ˆ๋ณดž๋“ค˜ ๋‘˜จฐ ๋‚œ๊ด€ด๋‹ค.
  • …Šคณ ๋ชจ๋“œ™€ กฐ๋ช… ๋ชจ๋“œ๊ฐ€ ๋งคšฐ  œ•œ๋˜–ด žˆ๋‹ค.
  • ‰ด๋”๋ฅผ งœง€•Šœผ๋ฉด “ธˆ˜๊ฐ€ —†๋‹ค. ‹ฌง€–ด …Šคณ๋ฅผ ž…žˆ๋Š” ๊ฒƒ๋„ ‰ด๋”—„œ ฒ˜๋ฆฌ•œ๋‹ค. ๊ทธ๋ƒฅ ๋‹จƒ‰œผ๋กœ ฒ˜๋ฆฌ•˜๋Š” ฝ”๋“œ๋„ ‰ด๋” ฝ”๋“œ๋ฅผ งœง€ •Šœผ๋ฉด ๊ทธ๋ƒฅ ––€ ๊ฒƒ๋งŒ ๋ณด๊ฒŒ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋„ šŒ „‹œ‚ฌˆ˜๋„ —†๋‹ค.

3. ฃผš”š”†Œ

3.1. ŒŒด”„ ๋ผธ

WebGL€ ผ ••œ ๋ฆ„๊ตฌกฐ๋ฅผ ๋งŒ๋“ค–ด ๋‘๊ณ  ๊ทธ ๊ฐ๋ถ€๋ถ„„ ๋งŒ๋“คˆ˜ žˆ๋„๋ก •ด ๋‘—ˆ๋‹ค. •„๋งˆ ตœ ™”๊ฐ€ ‰ฌšด ƒ“— ๊ทธ๋Ÿฌ–ˆœผ๋ฆฌ๊ณ  ƒ๊ฐ๋œ๋‹ค.
WebGlํŒŒ์ดํ”„๋ผ์ธ
[PNG image (52.47 KB)]

Attribute๋Š” ๊ฐ ฌธŠธ ๋ณ„๋กœ  „๋‹ฌ๋˜๋Š”  •๋ณดด๊ณ  uniform €  „ฒด—„œ ๊ณต†ต ธ  •๋ณดด๋‹ค. ผ๋ฐ˜ œผ๋กœ Attribute๋Š” ๊ฐ  • ˜ œ„น˜  •๋ณด™€ ๊ฐ ง€ ˜ ๋ฒ•„  ๋ฒก„ •๋ณด๋ฅผ„  „๋‹ฌ•œ๋‹ค. uniform€ ผ๋ฐ˜ œผ๋กœ นด๋ฉ”๋ผ˜ œ„น˜๋‚˜ ™˜๊ฒฝ๊ด‘˜ œ„น˜ฒ˜๋Ÿผ  „ฒด ธ ๊ฒƒ„  „๋‹ฌ•œ๋‹ค. Attribute๋‚˜ uniform€ ผข…˜ ๋ณ€ˆ˜ธ๋ฐ •ธ๋“ค„ –ป–ด™€„œ ๊ทธ๊ฒƒ„ †ต•ด ๊ฐ’„  „๋‹ฌ• ˆ˜ žˆ๋‹ค. ฆ‰ Atrribute๋‚˜ Uniform€ Javascriptธก—„œ ‰ด๋”๋กœ  •๋ณด๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒด๋‹ค. varying€ ‰ด๋” ๊ฐ„˜  •๋ณด  „๋‹ฌ— ‚ฌšฉ๋œ๋‹ค. vertex shader—„œ fragment shader๋กœ ๊ฐ’ด  „๋‹ฌ๋˜๋ฉฐ ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅ•˜๋‹ค(ŒŒด”„๋ผธ ๊ตฌกฐƒ ๋‹น—ฐ•œ ๊ฒƒด๋‹ค). ด๋•Œ vertex shader๋Š” ๊ฐ  • (๊ผญง€ ) fragment shader๋Š” ๊ฐ ”ฝ…€— •œ๋ฒˆ ˜ธถœ๋˜๊ฒŒ ๋˜๋Š”๋ฐ ๊ฐ  •  ‚ฌด˜ ๊ฐ’๋“ค€ ๋ณด๊ฐ„๋ฒ•„ณ  „๋‹ฌ๋˜๊ฒŒ ๋œ๋‹ค(๊ทธ๋ผ๋””–ธŠธ ๊ฐ™€ ๋А๋‚Œด๋‹ค ค‘๊ฐ„๊ฐ’„ •Œ•„„œ ๋งŒ๋“ค–ด ค€๋‹ค).

๊ฐ ‰ด๋”๋Š” ๋™‹œ— ๋™ž‘• ˆ˜ žˆ๋Š”๋ฐ ๋‹น—ฐžˆ ด๋“ค€ „œ๋กœ๊ฐ„— ๋…๋ฆฝ ด–ด•ผ •œ๋‹ค.

3.2. ‰ด๋”

‰ด๋”๋Š” ‰ด๋” –ธ–ด๋กœ ๋”ฐ๋กœ งœฃผ๊ณ  ปดŒŒผ •ด•ผ•˜๋ฉฐ ‹ฌง€–ด ๋งฌ๊นŒง€ ‹œผœฃผ–ด•ผ •œ๋‹ค. GPU˜ ๊ฐ•๋ ฅ•œ –‰๋ ฌ—ฐ‚ฐ ๋Šฅ๋ ฅ„ ๊ฐ€ ธ๋‹ค “ฐ๊ธฐ œ„•ด„œธ๊ฒƒœผ๋กœ ๋ณดด๋Š”๋ฐ ด๊ฒƒ„ ‚ฌšฉ•˜ง€ •Š๊ณ „œ๋Š” ˜ˆ œŒŒผ๋„ ๋Œ๋ ค๋ณผˆ˜๊ฐ€ —†๋‹ค. ๋‹ค–‰ด –ธ–ด๋Š” C–ธ–ด™€ ๋งคšฐ œ ‚ฌ•˜๊ณ  –‰๋ ฌ—ฐ‚ฐด ๋ชจ๋‘ žˆ๊ธฐ ๋•Œ๋ฌธ— ๋”žˆ –ด๋ ต๊ฐ๋‚˜ •˜„ •Š๋‹ค. ๋‹ค๋งŒ –ด๋А๋ถ€๋ถ„—„œ –ด๋””™€ —ฐ๊ฒฐ๋˜๋Š”ง€ ด•ด•˜๋Š”๋ฐ ‹œ๊ฐ„ด ๊ธ๋ฆฐ๋‹ค.

3.2.1. vertex shader

๊ฐ  • (vertex, ๊ผญง€ )๋งˆ๋‹ค ˜ธถœ๋˜๋ฉฐ ฃผ๋กœ ๊ผญง€ ˜ œ„น˜๋ฅผ —ฐ‚ฐ•˜๊ณ  ‹ค œ View— ˆ˜•˜๋Š” —ฐ‚ฐ„ ฃผ๋กœ •˜๊ฒŒ ๋œ๋‹ค. •œ๋งˆ๋””๋กœ ๋ชจ๋ธ˜ œ„น˜ ๋ณ€™˜๊ณผ นด๋ฉ”๋ผ ‹œ — ๋”ฐ๋ฅธ ๋ณ€™˜ ›๊ทผ๋ฒ•„  šฉ•˜๋Š” ๋ณ€™˜๋“„ ˆ˜–‰•œ๋‹ค.

3.2.2. fragment shader

๊ฐ  •  ‚ฌด— žˆ๋Š” ”ฝ…€ ๋งˆ๋‹ค ˜ธถœ๋œ๋‹ค. ฃผ๋กœ ๊ด‘›šจ๊ณผ๋ฅผ  šฉ•œ ”ฝ…€˜ ตœข… ธ ƒ‰๊น”ด๋‚˜ …Šคณ —ฐ‚ฐ— ‚ฌšฉ๋œ๋‹ค. varying๋ณ€ˆ˜๋ฅผ vertex shader—„œ fragment shader๋กœ ๋„˜๊ฒจฃผ๋ฉด ๊ฐ  •  ‚ฌด—๋Š” ๋ณด๊ฐ„๋ฒ•œผ๋กœ ๋ณ€™˜๋œ ๊ฐ’ด ๋„˜–ด ˜จ๋‹ค.

4. ˜ˆ œฝ”๋“œ

•„๋ž˜ ฝ”๋“œ๋Š”  •™••˜ง€ •Šœผ๋ฉฐ —ฐŠต ๋„ค‘˜ ฝ”๋“œž…๋‹ˆ๋‹ค. ๋˜•œ WebGL˜ Šน„ƒ ฝ”๋“œ๊ฐ€ ๋ถ„‚ฐ๋˜–ด žˆŠต๋‹ˆ๋‹ค. ˜„žฌ ๊ฐฒด ๋ž˜•‘„ „–‰ค‘ž…๋‹ˆ๋‹ค.

˜„žฌ ๊ฐฒด ๋ž˜•‘ค‘ ค‘๋Œ€•œ ๋ฌธ œ— ๋ด‰ฐฉ. ๋Œ€๋ถ€๋ถ„˜ ๋ชจ๋“ˆ๊ณผ „ด๋” ฝ”๋“œ๋Š” ฝœ๋ฐœผ๋กœ ˜ธถœ๋˜๋Š”๋ฐ ด๊ฒƒ„   ˆžˆ ๋ž˜•‘•  ๋ฐฉ๋ฒ•ด —†๋‹ค. webGL๊ณผ๋Š” •˜๋“ —ฐ๊ด€ด —†๋Š” ๋ถ€๋ถ„ด๋ผ„œ ๊ฐž •Œ•„„œ ๊ตฌ˜„•˜๋„๋ก •ด๋„ ๋˜ง€๋งŒ ๋Œ€๋ถ€๋ถ„˜ ๊ฒฝšฐ ๊ฐ™€ ฝ”๋“œ๋ฅผ ๋‹คŠค งœ๊ณ  žˆ๋Š” ๋‚˜๋ฅผ ๋ณด๊ฒŒ ๋œ๋‹ค. ด๊ฒƒ„ –ด๋–ป๊ฒŒ •ด•ผ ž˜•œ ๋ž˜•‘ด๋ผ • ˆ˜ žˆ„๊นŒ?

4.1. vertexShader

attribute vec3 aVertexPosition;
attribute vec3 aVertexNormal;

uniform mat4 matCamara;
uniform mat4 matProject;

uniform vec3 lightPos;
uniform vec3 lightDirection;
uniform vec4 materialDiffuse;
uniform vec4 lightDiffuse;

varying vec4 vFinalColor;
varying vec3 vNormal;

void main(void){

	vec3 N = normalize((vec4(aVertexNormal, 1.0) * matCamara).xyz);//nomal compute
	vec3 L = normalize(lightDirection); //lightDrection

	float lambertTerm = max(dot(N, -L), 0.0);
	vec4 Id =  lightDiffuse * materialDiffuse * lambertTerm;

	vNormal = normalize((vec4(aVertexNormal, 1.0) * matCamara).xyz);

	vFinalColor = Id;
	vFinalColor.a = 1.0;
	gl_Position = matProject * matCamara * vec4((aVertexPosition), 1.0);
	gl_Position.w = 1.0;
}

4.2. fragmentShader

#ifdef GL_ES
precision highp float;
#endif

uniform vec3 lightPos;
uniform vec3 lightDirection;
uniform vec4 materialDiffuse;
uniform vec4 lightDiffuse;
	
varying vec4 vFinalColor;
varying vec3 vNormal;

void main(void) {

	vec3 L = normalize(lightDirection);

    gl_FragColor = vFinalColor + vec4(0.01,0.01,0.01, 1.0);
}

4.3. javascript

var cube = {
  "vertices": [
     0.2, 0.2, 0.2, //0
     0.2, 0.2,-0.2, //1
     0.2,-0.2, 0.2, //2
     0.2,-0.2,-0.2, //3
    -0.2, 0.2,-0.2, //4
    -0.2, 0.2, 0.2, //2
    -0.2,-0.2,-0.2, //6
    -0.2,-0.2, 0.2  //7
  ],
  "normals": [
     1, 1, 1, //0
     1, 1,-1, //1
     1,-1, 1, //2
     1,-1,-1, //3
    -1, 1,-1, //4
    -1, 1, 1, //5
    -1,-1,-1, //6
    -1,-1, 1  //7

  ],
  "indices" : [
    0,2,3, 0,3,1,
    4,6,7, 4,7,5,
    4,5,0, 4,0,1,
    7,6,3, 7,3,2,
    5,7,2, 5,2,0,
    1,3,6, 1,6,4
  ]
}

var init = function(){
  var gl = getGLContext();


  var cubeBuffer = new GLBuffer(gl, cube);

  var shader;
  async.parallel([
    function(callback){
      var url = document.getElementById("vertexShader").getAttribute("src");
      ajax(url, callback);
    },
    function(callback){
      var url = document.getElementById("fragmentShader").getAttribute("src");
      ajax(url, callback);
    },
  ], function (err, data){
    shader = new GLShader(gl, data[0], data[1]);

    gl.useProgram(shader.program);
    shader.aVertexPosition = gl.getAttribLocation(shader.program, "aVertexPosition");
    shader.aVertexNormal = gl.getAttribLocation(shader.program, "aVertexNormal");

    var cam = gl.getUniformLocation(shader.program, "matCamara");
    
    var camMat = mat4.identity(mat4.create());

    mat4.translate(camMat, camMat, [0, 0, 0.1]);
    mat4.rotate(camMat, camMat, Math.PI/4, [1,0.5,0.5]);

    gl.uniformMatrix4fv(cam, false, camMat);

    var lightPos = shader.getUniformLocation("lightPos");
    gl.uniform3fv(lightPos, [0.1,0.1,0.1]);

    var lightDirection = shader.getUniformLocation("lightDirection");
    gl.uniform3fv(lightDirection, [-1, -1, -1]);
    
    var materialDiffuse = shader.getUniformLocation("materialDiffuse");
    gl.uniform4fv(materialDiffuse, [0.8, 0.2, 0.2, 1.0]);

    var lightDiffuse = shader.getUniformLocation("lightDiffuse");
    gl.uniform4fv(lightDiffuse, [1,1,1,1]);

    var matProject = mat4.identity(mat4.create());//2PI = 360d -> 1d = PI/180
    mat4.perspective(matProject, Math.PI/180 * 80, 1, 0, 1);

    gl.uniformMatrix4fv(
      shader.getUniformLocation("matProject"),
      false,
      matProject
    );

    onReady(gl, cubeBuffer, shader);
  });
}

setTimeout(init, 0);
function onReady(gl, buffer, shader){
  onDraw();

  function onDraw(){
    gl.clearColor(0.0, 0.0, 0.0, 1.0);

    gl.enable(gl.DEPTH_TEST);

    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    gl.viewport(0,0,300,300);

    gl.enableVertexAttribArray(shader.aVertexPosition);
    gl.enableVertexAttribArray(shader.aVertexNormal);

    gl.bindBuffer(gl.ARRAY_BUFFER, buffer.vertex);
    gl.vertexAttribPointer(shader.aVertexPosition, 3, gl.FLOAT, false, 0, 0);

    gl.bindBuffer(gl.ARRAY_BUFFER, buffer.normal);
    gl.vertexAttribPointer(shader.aVertexNormal, 3, gl.FLOAT, false, 0, 0);

    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer.index);
    gl.drawElements(gl.TRIANGLES, buffer.index.length, gl.UNSIGNED_SHORT, 0);
  }
}

function ajax(url, callback){
  var ajax = new XMLHttpRequest();
  ajax.onreadystatechange = function(){
    if(ajax.readyState === 4){
      //complete requset
      if(ajax.status === 200){
        //not error
        callback(null, ajax.responseText);
      }
    }
  }

  ajax.open("GET", url, true);//if need Sync method set false;
  ajax.send(null);
}
//Lib function
function getGLContext(){
  var canvas = document.getElementsByTagName("canvas");
    
  canvas = [].filter.call(canvas, function(element){
    if(element.getAttribute("WebGL") != null)
      return true;
    else
      return false;
  });
  canvas = canvas[0];

  return canvas.getContext("experimental-webgl");
}


//Lib Class
function GLBuffer(gl, model){
  this.model = model;

  try {
    //only binded buffer can send data
    //vertex is coord of points
    var vertexBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(model.vertices), gl.STATIC_DRAW);
    gl.bindBuffer(gl.ARRAY_BUFFER, null);

    //index is triangle point index of suface
    var indexBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(model.indices), gl.STATIC_DRAW);
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);

    //normals Buffer
    var normalBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(model.normals), gl.STATIC_DRAW);
    gl.bindBuffer(gl.ARRAY_BUFFER, null);

    this.vertex = vertexBuffer;
    this.index = indexBuffer;
    this.index.length = model.indices.length;
    this.normal = normalBuffer;
  } catch(e){
    throw Error("Can not create Buffer");
  }
}
function GLShader(gl, vertexSource, fragmentSource){
  var shaderProgram = gl.createProgram();

  //compile Source
  var vertexShader = gl.createShader(gl.VERTEX_SHADER);
  gl.shaderSource(vertexShader, vertexSource);
  gl.compileShader(vertexShader);

  checkCompile(vertexShader);

  var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
  gl.shaderSource(fragmentShader, fragmentSource);
  gl.compileShader(fragmentShader);

  checkCompile(fragmentShader);

  //attach shader
  gl.attachShader(shaderProgram, fragmentShader);
  
  gl.attachShader(shaderProgram, vertexShader);
  
  //link
  gl.linkProgram(shaderProgram);

  this.program = shaderProgram;

  this._private = {
    gl : gl
  }

  function checkCompile(shader){
    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
      throw Error(gl.getShaderInfoLog(shader));
    }
  }
}
GLShader.prototype.getUniformLocation = function(name){
  return this._private.gl.getUniformLocation(this.program, name);
}
GLShader.prototype.uniform4fv = function(name, arr){
  this._private.gl.uniform4fv(this.getUniformLocation(name), arr);
}
GLShader.prototype.uniform3fv = function(name, arr){
  this._private.gl.uniform3fv(this.getUniformLocation(name), arr);
}
GLShader.prototype.uniformMatrix4fv = function(name, arr){
  this._private.gl.uniformMatrix4fv(this.getUniformLocation(name), false, arr);
}

5. WebGL˜ ขŒ‘œ๊ณ„

OpenGL๊ณผ ๋™ผ•œ -1.0 ~ 1.0ด๋ฉฐ ด๋ฅผ ๋„˜–ด๊ฐˆ‹œ—๋Š” ‘œ˜„๋˜ง€ •Š๋Š”๋‹ค. ๋งคŠธ๋ฆญŠค —ฐ‚ฐ„ ง ‘•ด•ผ๋งŒ •˜๋Š” WebGL—„œ๋Š” ด ด ๊ฐ„๊ณผ๋˜๊ธฐ ‰ฌ›Œ„œ ด๋ฏธ ๊ทธ๋ฆฐ Ž˜ดง€๊ฐ€ –ด๋””— žˆ๋Š”ง€ ฐพ๋Š” ˜„ƒด ๋ฐœƒ•˜๊ฒŒ ๋œ๋‹ค.

๊ณ„† ž‘„ค‘.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:23
Processing time 0.0262 sec