WebGL-확장

이 장에서는 WebGL을 사용하여 삼각형의 배율을 수정하는 방법을 보여주는 예제를 사용합니다.

스케일링

크기 조정은 객체의 크기를 늘리거나 줄이는 것입니다. 예를 들어 삼각형에 [a, b, c] 크기의 정점이있는 경우 정점 [2a, 2b, 2c]가있는 삼각형은 크기가 두 배가됩니다. 따라서 삼각형의 배율을 조정하려면 각 정점에 배율 인수를 곱해야합니다. 특정 정점의 크기를 조정할 수도 있습니다.

삼각형의 크기를 조정하기 위해 프로그램의 정점 셰이더에서 균일 한 행렬을 만들고이 행렬과 좌표 값을 곱합니다. 나중에 대각선 위치 (마지막 대각선 위치 1)에서 x, y, z 좌표의 배율 인수를 갖는 4x4 대각 행렬을 전달합니다.

필수 단계

삼각형의 크기를 조정하는 WebGL 응용 프로그램을 만들려면 다음 단계가 필요합니다.

Step 1 − Prepare the Canvas and Get the WebGL Rendering Context

이 단계에서는 다음을 사용하여 WebGL 렌더링 컨텍스트 객체를 얻습니다. getContext().

Step 2 − Define the Geometry and Store it in the Buffer Objects

삼각형을 그리기 때문에 삼각형의 세 꼭지점을 전달하고 버퍼에 저장해야합니다.

var vertices = [ -0.5,0.5,0.0, -0.5,-0.5,0.0, 0.5,-0.5,0.0, ];

Step 3 − Create and Compile the Shader Programs

이 단계에서는 정점 셰이더 및 조각 셰이더 프로그램을 작성하고 컴파일 한 다음이 두 프로그램을 연결하여 결합 된 프로그램을 만들어야합니다.

  • Vertex Shader− 프로그램의 버텍스 쉐이더에서 3D 좌표를 저장할 벡터 속성을 정의합니다. 이와 함께 스케일링 계수를 저장할 균일 행렬을 정의하고 마지막으로이 두 값을 곱하여gl_position 정점의 최종 위치를 유지합니다.

var vertCode =
   'attribute vec4 coordinates;' +
   'uniform mat4 u_xformMatrix;' +
   'void main(void) {' +
      ' gl_Position = u_xformMatrix * coordinates;' +
   '}';
  • Fragment Shader − 프래그먼트 셰이더에서 간단히 프래그먼트 색상을 gl_FragColor 변하기 쉬운.

var fragCode = 'void main(void) {' +' gl_FragColor = vec4(1, 0.5, 0.0, 1);' +'}';

Step 4 − Associate the Shader Programs with the Buffer Objects

이 단계에서는 버퍼 개체를 셰이더 프로그램과 연결합니다.

Step 5 − Drawing the Required Object

인덱스를 사용하여 삼각형을 그리기 때문에 drawArrays()방법. 이 방법에는 고려할 정점 / 요소의 수를 전달해야합니다. 삼각형을 그리므로 3을 매개 변수로 전달합니다.

gl.drawArrays(gl.TRIANGLES, 0, 3);

예 – 삼각형 크기 조정

다음 예는 삼각형의 크기를 조정하는 방법을 보여줍니다.

<!doctype html>
<html>
   <body>
      <canvas width = "300" height = "300" id = "my_Canvas"></canvas>

      <script>
         /*=================Creating a canvas=========================*/
         var canvas = document.getElementById('my_Canvas');
         gl = canvas.getContext('experimental-webgl'); 

         /*===========Defining and storing the geometry==============*/
         var vertices =  [
            -0.5,0.5,0.0, 	
            -0.5,-0.5,0.0, 	
            0.5,-0.5,0.0,   
         ];

         //Create an empty buffer object and store vertex data

         var vertex_buffer = gl.createBuffer();                                                     
         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);                                                
         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);           
         gl.bindBuffer(gl.ARRAY_BUFFER, null);  

         /*========================Shaders============================*/

         //Vertex shader source code
         var vertCode =
            'attribute vec4 coordinates;' + 
            'uniform mat4 u_xformMatrix;' +
            'void main(void) {' +
               '  gl_Position = u_xformMatrix * coordinates;' +
            '}';

         //Create a vertex shader program object and compile it                
         var vertShader = gl.createShader(gl.VERTEX_SHADER);
         gl.shaderSource(vertShader, vertCode);
         gl.compileShader(vertShader);

         //fragment shader source code
         var fragCode =
            'void main(void) {' +
               '   gl_FragColor = vec4(0.0, 0.0, 0.0, 0.1);' +
            '}';

         //Create a fragment shader program object and compile it 
         var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
         gl.shaderSource(fragShader, fragCode);
         gl.compileShader(fragShader);

         //Create and use combiened shader program
         var shaderProgram = gl.createProgram();
         gl.attachShader(shaderProgram, vertShader);
         gl.attachShader(shaderProgram, fragShader);
         gl.linkProgram(shaderProgram);

         gl.useProgram(shaderProgram); 

         /*===================scaling==========================*/

         var Sx = 1.0, Sy = 1.5, Sz = 1.0;
         var xformMatrix = new Float32Array([
            Sx,   0.0,  0.0,  0.0,
            0.0,  Sy,   0.0,  0.0,
            0.0,  0.0,  Sz,   0.0,
            0.0,  0.0,  0.0,  1.0  
         ]);

         var u_xformMatrix = gl.getUniformLocation(shaderProgram, 'u_xformMatrix');
         gl.uniformMatrix4fv(u_xformMatrix, false, xformMatrix);

         /* ===========Associating shaders to buffer objects============*/
         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);   

         var coordinatesVar = gl.getAttribLocation(shaderProgram, "coordinates"); 
         gl.vertexAttribPointer(coordinatesVar, 3, gl.FLOAT, false, 0, 0);  
         gl.enableVertexAttribArray(coordinatesVar);

         /*=================Drawing the Quad========================*/ 
         gl.clearColor(0.5, 0.5, 0.5, 0.9);
         gl.enable(gl.DEPTH_TEST);

         gl.clear(gl.COLOR_BUFFER_BIT);
         gl.viewport(0,0,canvas.width,canvas.height);
         gl.drawArrays(gl.TRIANGLES, 0, 3);
      </script>
   </body>
</html>

이 예제를 실행하면 다음 출력이 생성됩니다.