WebGL-그리기 포인트
프리미티브를 그리기 위해 단계별 프로세스를 따르는 방법에 대해 앞서 (5 장에서) 논의했습니다. 프로세스를 5 단계로 설명했습니다. 새 모양을 그릴 때마다이 단계를 반복해야합니다. 이 장에서는 WebGL에서 3D 좌표로 점을 그리는 방법을 설명합니다. 더 나아 가기 전에 5 단계를 다시 살펴 보겠습니다.
필수 단계
점을 그리는 WebGL 응용 프로그램을 만들려면 다음 단계가 필요합니다.
Step 1 − Prepare the Canvas and Get the WebGL Rendering Context
이 단계에서는 메소드를 사용하여 WebGL Rendering 컨텍스트 객체를 얻습니다. getContext().
Step 2 − Define the Geometry and Store it in the Buffer Objects
세 점을 그리기 때문에 3D 좌표로 세 개의 정점을 정의하고 버퍼에 저장합니다.
var vertices = [
-0.5,0.5,0.0,
0.0,0.5,0.0,
-0.25,0.25,0.0,
];
Step 3 − Create and Compile the Shader Programs
이 단계에서는 버텍스 셰이더 및 프래그먼트 셰이더 프로그램을 작성하고 컴파일하고이 두 프로그램을 연결하여 결합 된 프로그램을 만들어야합니다.
Vertex Shader − 주어진 예제의 버텍스 쉐이더에서 3D 좌표를 저장할 벡터 속성을 정의하고이를 gl_position 변하기 쉬운.
gl_pointsize포인트에 크기를 할당하는 데 사용되는 변수입니다. 포인트 크기를 10으로 지정합니다.
var vertCode = 'attribute vec3 coordinates;' +
'void main(void) {' +
' gl_Position = vec4(coordinates, 1.0);' +
'gl_PointSize = 10.0;'+
'}';
Fragment Shader − 프래그먼트 셰이더에서 간단히 프래그먼트 색상을 gl_FragColor 변하기 쉬운
var fragCode = 'void main(void) {' +' gl_FragColor = vec4(1, 0.5, 0.0, 1);' +'}';
Step 4 − Associate the Shader Programs to Buffer Objects
이 단계에서는 버퍼 개체를 셰이더 프로그램과 연결합니다.
Step 5 − Drawing the Required Object
우리는 방법을 사용합니다 drawArrays()점을 그립니다. 우리가 그리려는 포인트의 개수는 3 개이므로 카운트 값은 3입니다.
gl.drawArrays(gl.POINTS, 0, 3)
예 – WebGL을 사용하여 세 점 그리기
다음은 세 점을 그리는 완전한 WebGL 프로그램입니다.
<!doctype html>
<html>
<body>
<canvas width = "570" height = "570" 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.0,0.5,0.0,
-0.25,0.25,0.0,
];
// Create an empty buffer object to store the vertex buffer
var vertex_buffer = gl.createBuffer();
//Bind appropriate array buffer to it
gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
// Pass the vertex data to the buffer
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
// Unbind the buffer
gl.bindBuffer(gl.ARRAY_BUFFER, null);
/*=========================Shaders========================*/
// vertex shader source code
var vertCode =
'attribute vec3 coordinates;' +
'void main(void) {' +
' gl_Position = vec4(coordinates, 1.0);' +
'gl_PointSize = 10.0;'+
'}';
// Create a vertex shader object
var vertShader = gl.createShader(gl.VERTEX_SHADER);
// Attach vertex shader source code
gl.shaderSource(vertShader, vertCode);
// Compile the vertex shader
gl.compileShader(vertShader);
// fragment shader source code
var fragCode =
'void main(void) {' +
' gl_FragColor = vec4(0.0, 0.0, 0.0, 0.1);' +
'}';
// Create fragment shader object
var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
// Attach fragment shader source code
gl.shaderSource(fragShader, fragCode);
// Compile the fragmentt shader
gl.compileShader(fragShader);
// Create a shader program object to store
// the combined shader program
var shaderProgram = gl.createProgram();
// Attach a vertex shader
gl.attachShader(shaderProgram, vertShader);
// Attach a fragment shader
gl.attachShader(shaderProgram, fragShader);
// Link both programs
gl.linkProgram(shaderProgram);
// Use the combined shader program object
gl.useProgram(shaderProgram);
/*======== Associating shaders to buffer objects ========*/
// Bind vertex buffer object
gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
// Get the attribute location
var coord = gl.getAttribLocation(shaderProgram, "coordinates");
// Point an attribute to the currently bound VBO
gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0);
// Enable the attribute
gl.enableVertexAttribArray(coord);
/*============= Drawing the primitive ===============*/
// Clear the canvas
gl.clearColor(0.5, 0.5, 0.5, 0.9);
// Enable the depth test
gl.enable(gl.DEPTH_TEST);
// Clear the color buffer bit
gl.clear(gl.COLOR_BUFFER_BIT);
// Set the view port
gl.viewport(0,0,canvas.width,canvas.height);
// Draw the triangle
gl.drawArrays(gl.POINTS, 0, 3);
</script>
</body>
</html>
다음 결과가 생성됩니다-