LabWebGL&ThreeJS 3D Affine Transform
LabWebGL&ThreeJS 3D Affine Transform
3D Graphics Pipeline
MỤC LỤC
1. Projection............................................................................................................1
1.1. File WebGLPerspectiveProjection.html....................................................................1
2. Viewport.............................................................................................................4
2.1. File WebGLViewport.html........................................................................................4
3. Lighting...............................................................................................................8
3.1. File WebGLDirectionalLightCube.html....................................................................8
4. Tham khảo........................................................................................................11
>> Yêu cầu chụp hình ảnh là kết quả thực hành của SV. Không sử dụng lại hình ảnh của
bài lab.
1. Projection
1.1. File WebGLPerspectiveProjection.html
<!DOCTYPE html>
<html>
<head>
<title>WebGL projections: perspective</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix-
min.js"></script>
function init() {
// Get canvas object from the DOM
var canvas = document.getElementById("myCanvas");
// Init shaders
var vs = document.getElementById('shaderVs').innerHTML;
var fs = document.getElementById('shaderFs').innerHTML;
initShaders(gl, vs, fs);
// Draw Scene
drawScene();
}
function drawScene() {
// Clear
gl.clear(gl.COLOR_BUFFER_BIT);
// Rotate
var mvMatrix = mat4.fromRotation(mat4.create(), count, [0.5, 0.5,
0.5]);
var uMvMatrix = gl.getUniformLocation(gl.program, "u_mvMatrix");
gl.uniformMatrix4fv(uMvMatrix, false, mvMatrix);
// Draw
gl.drawElements(gl.TRIANGLES, 6 * 2 * 3, gl.UNSIGNED_SHORT, 0);
function initVertexShader(gl) {
// Vertexes and colors (X, Y, Z, R, G, B)
var vertexesAndColors = [
-0.5, -0.5, -0.5, 1, 1, 0,
0.5, -0.5, -0.5, 1, 1, 0,
0.5, 0.5, -0.5, 1, 1, 0,
-0.5, 0.5, -0.5, 1, 1, 0,
4, 5, 6,
4, 6, 7,
8, 9, 10,
8, 10, 11,
// Write u_vMatrix
// Create program
var glProgram = gl.createProgram();
// Use program
gl.useProgram(glProgram);
gl.program = glProgram;
}
</head>
<body onload="init()">
<canvas id="myCanvas" width="640" height="480"></canvas>
</body>
</html>
<head>
<title>WebGL projections: viewport change</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix-
min.js"></script>
function init() {
// Get canvas object from the DOM
canvas = document.getElementById("myCanvas");
// Init shaders
var vs = document.getElementById('shaderVs').innerHTML;
var fs = document.getElementById('shaderFs').innerHTML;
initShaders(gl, vs, fs);
// Draw Scene
drawScene();
}
function drawScene() {
// Change viewport
var x = document.getElementById("x").value;
var y = document.getElementById("y").value;
var aspect = document.getElementById("aspect").value;
gl.viewport(x, y, aspect * canvas.width, aspect * canvas.height);
// Clear
gl.clear(gl.COLOR_BUFFER_BIT);
// Rotate
var mvMatrix = mat4.fromRotation(mat4.create(), count, [0.5, 0.5,
0.5]);
var uMvMatrix = gl.getUniformLocation(gl.program, "u_mvMatrix");
gl.uniformMatrix4fv(uMvMatrix, false, mvMatrix);
// Draw
gl.drawElements(gl.TRIANGLES, 6 * 2 * 3, gl.UNSIGNED_SHORT, 0);
function initVertexShader(gl) {
// Vertexes and colors (X, Y, Z, R, G, B)
var vertexesAndColors = [
-0.5, -0.5, -0.5, 1, 1, 0,
0.5, -0.5, -0.5, 1, 1, 0,
0.5, 0.5, -0.5, 1, 1, 0,
-0.5, 0.5, -0.5, 1, 1, 0,
4, 5, 6,
4, 6, 7,
8, 9, 10,
8, 10, 11,
// Write u_vMatrix
var vMatrixUniform = gl.getUniformLocation(gl.program, "u_vMatrix");
var vMatrix = mat4.lookAt(mat4.create(), [0, 0, -3], [0, 0, 0], [0, 1,
0]);
gl.uniformMatrix4fv(vMatrixUniform, false, vMatrix);
}
// Create program
var glProgram = gl.createProgram();
// Use program
gl.useProgram(glProgram);
gl.program = glProgram;
}
</head>
<body onload="init()">
<canvas id="myCanvas" width="640" height="480"></canvas><br>
<input type="range" id="x" min="0" max="640" value="0" step="1"> x<br>
<input type="range" id="y" min="0" max="640" value="0" step="1"> y<br>
<input type="range" id="aspect" min="0" max="1" value="1" step="0.01">
aspect<br>
</body>
</html>
Kết quả
<head>
<title>Lighting: cube lit by directional light</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix-
min.js"></script>
void main(void) {
gl_Position = u_pMatrix * u_vMatrix * u_mvMatrix * a_Position;
void main(void) {
gl_FragColor = v_Color;
}
</script>
<script>
var count = 0.0;
function init() {
// Get canvas object from the DOM
var canvas = document.getElementById("myCanvas");
// Init shaders
var vs = document.getElementById('shaderVs').innerHTML;
var fs = document.getElementById('shaderFs').innerHTML;
initShaders(gl, vs, fs);
// Draw Scene
drawScene(gl, canvas);
}
// Init projection
initProjection(gl, canvas);
// Rotate
var mvMatrix = mat4.fromRotation(mat4.create(), count, [ 0.0, 1.0, 0.5 ]);
var uMvMatrix = gl.getUniformLocation(gl.program, "u_mvMatrix");
gl.uniformMatrix4fv(uMvMatrix, false, mvMatrix);
// Draw
gl.drawElements(gl.TRIANGLES, 6 * 2 * 3, gl.UNSIGNED_BYTE, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(gl.ARRAY_BUFFER, normals, gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
}
// Write u_vMatrix
var vMatrix = mat4.lookAt(mat4.create(), [ 0, 0, -3 ], [ 0, 0, 0 ], [ 0, 1, 0
]);
var vMatrixUniform = gl.getUniformLocation(gl.program, "u_vMatrix");
gl.uniformMatrix4fv(vMatrixUniform, false, vMatrix);
// Write u_LightColor
var lightColor = [ 1.0, 1.0, 1.0 ]; // white
var lightColorUniform = gl.getUniformLocation(gl.program, "u_LightColor");
gl.uniform3fv(lightColorUniform, lightColor);
// Write u_LightDirection
var x = document.getElementById("x").value;
var y = document.getElementById("y").value;
var z = document.getElementById("z").value;
var lightDirection = [ x, y, z ];
vec3.normalize(lightDirection, lightDirection);
var lightDirectionUniform = gl.getUniformLocation(gl.program,
"u_LightDirection");
gl.uniform3fv(lightDirectionUniform, lightDirection);
}
// Create program
var glProgram = gl.createProgram();
// Use program
gl.useProgram(glProgram);
gl.program = glProgram;
}
</head>
<b>Light direction</b><br>
<input type="range" id="x" min="-20" max="20" value="2" step="1">X<br>
<input type="range" id="y" min="-20" max="20" value="-8" step="1">Y<br>
<input type="range" id="z" min="-20" max="20" value="-8" step="1">Z<br>
</body>
</html>
Kết quả
4. Tham khảo
[1]. https://github.com/bonigarcia/webgl-examples