Cube
Пример с вращающимся кубом
by Trufi
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.3.1/gl-matrix-min.js"></script>
<script id="vertexShader" type="x-shader/x-vertex">
attribute vec3 a_position;
attribute vec3 a_color;
uniform mat4 u_cube;
uniform mat4 u_camera;
varying vec3 v_color;
void main(void) {
v_color = a_color;
gl_Position = u_camera * u_cube * vec4(a_position, 1.0);
}
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
precision mediump float;
varying vec3 v_color;
void main(void) {
gl_FragColor = vec4(v_color.rgb, 1.0);
}
</script>
CSS
html, body {
margin: 0;
width: 100%;
height: 100%;
overflow: hidden;
}
JavaScript
// Инициализация canvas и получение из него WebGL контекста
var canvas = document.createElement('canvas');
document.body.appendChild(canvas);
var gl = canvas.getContext('webgl');
// Устанавливаем размеры canvas и вьюпорт у WebGL
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
gl.viewport(0, 0, window.innerWidth, window.innerHeight);
// Инициализация шейдеров
var vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, document.getElementById('vertexShader').text);
gl.compileShader(vertexShader);
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
console.log(gl.getShaderInfoLog(vertexShader));
}
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, document.getElementById('fragmentShader').text);
gl.compileShader(fragmentShader);
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
console.log(gl.getShaderInfoLog(fragmentShader));
}
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
console.log('Could not initialize shaders');
}
// Получим местоположение переменных в программе шейдеров
var uCube = gl.getUniformLocation(program, 'u_cube');
var uCamera = gl.getUniformLocation(program, 'u_camera');
var aPosition = gl.getAttribLocation(program, 'a_position');
var aColor = gl.getAttribLocation(program, 'a_color');
var vertexBuffer = gl.createBuffer();
var vertices = [
// Передняя грань
-1, -1, -1,
1, -1, -1,
-1, -1, 1,
1, -1, 1,
-1, -1, 1,
1, -1, -1,
// Задняя грань
-1, 1, -1,
-1, 1, 1,
1, 1, -1,
1, 1, 1,
1, 1, -1,
-1, 1, 1,
// Нижняя грань
-1, -1, -1,
-1, 1, -1,
1, -1, -1,
1, 1, -1,
1, -1, -1,
-1, 1, -1,
// Верхняя грань
-1, -1, 1,
1, -1, 1,
-1, 1, 1,
1, 1, 1,
-1, 1, 1,
1, -1, 1,
...