WebGL - Çizim Modları
Önceki bölümde (Bölüm 12), WebGL kullanarak nasıl üçgen çizileceğini tartışmıştık. Üçgenlere ek olarak, WebGL çeşitli diğer çizim modlarını da destekler. Bu bölüm WebGL tarafından desteklenen çizim modlarını açıklamaktadır.
Mod Parametresi
Yöntemlerin söz dizimine bir göz atalım - drawElements() ve Çiz Arrays().
void drawElements(enum mode, long count, enum type, long offset);
void drawArrays(enum mode, int first, long count);
Açıkça gözlemlerseniz, her iki yöntem de bir parametre kabul eder mode. Bu parametreyi kullanarak, programcılar WebGL'deki çizim modunu seçebilirler.
WebGL tarafından sağlanan çizim modları aşağıdaki tabloda listelenmiştir.
Sr.No. | Mod ve Açıklama |
---|---|
1 | gl.POINTS Bir dizi nokta çizmek için. |
2 | gl.LINES Bir dizi bağlantısız çizgi parçası (ayrı çizgiler) çizmek için. |
3 | gl.LINE_STRIP Bir dizi bağlantılı çizgi parçası çizmek için. |
4 | gl.LINE_LOOP Bir dizi bağlantılı çizgi parçası çizmek için. Ayrıca bir döngü oluşturmak için ilk ve son köşeleri birleştirir. |
5 | gl.TRIANGLES Bir dizi ayrı üçgen çizmek. |
6 | gl.TRIANGLE_STRIP Şerit şeklinde bir dizi bağlantılı üçgen çizmek. |
7 | gl.TRIANGLE_FAN Fan benzeri bir şekilde ilk tepe noktasını paylaşan bir dizi bağlantılı üçgen çizmek. |
Örnek - Üç Paralel Çizgi Çekin
Aşağıdaki örnek, kullanarak üç paralel çizginin nasıl çizileceğini gösterir. gl.LINES.
<!doctype html>
<html>
<body>
<canvas width = "300" height = "300" id = "my_Canvas"></canvas>
<script>
/*======= Creating a canvas =========*/
var canvas = document.getElementById('my_Canvas');
var gl = canvas.getContext('experimental-webgl');
/*======= Defining and storing the geometry ======*/
var vertices = [
-0.7,-0.1,0,
-0.3,0.6,0,
-0.3,-0.3,0,
0.2,0.6,0,
0.3,-0.3,0,
0.7,0.6,0
]
// Create an empty buffer object
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);' +
'}';
// 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 the 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 triangle =============*/
// 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 and depth buffer
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
// Set the view port
gl.viewport(0,0,canvas.width,canvas.height);
// Draw the triangle
gl.drawArrays(gl.LINES, 0, 6);
// POINTS, LINE_STRIP, LINE_LOOP, LINES,
// TRIANGLE_STRIP,TRIANGLE_FAN, TRIANGLES
</script>
</body>
</html>
Bu örneği çalıştırırsanız, aşağıdaki çıktıyı üretir -
Çizim Modları
Yukarıdaki programda, modunu değiştirirseniz drawArrays() Aşağıdaki çizim modlarından biri ile her seferinde farklı çıktılar üretecektir.
Çizim Modları | çıktılar |
---|---|
LINE_STRIP |
|
LINE_LOOP |
|
ÜÇGEN_STRIP |
|
TRIANGLE_FAN |
|
ÜÇGENLER |
|