ÐавайÑе помеÑÑим Ð½Ð°Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð² ÑÑÑÑ
меÑное пÑоÑÑÑанÑÑво, добавив еÑÑ 5 гÑаней, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÐºÑб. ЧÑÐ¾Ð±Ñ ÑделаÑÑ ÑÑо наиболее пÑодÑкÑивно, вмеÑÑо ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑин непоÑÑедÑÑвеннÑм вÑзовом меÑода gl.drawArrays()
, Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð¼Ð°ÑÑив веÑÑин в виде ÑаблиÑÑ Ð¸ ÑÑÑлаÑÑÑÑ Ð½Ð° каждÑÑ Ð²ÐµÑÑÐ¸Ð½Ñ Ð² ÑÑой ÑаблиÑе, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ каждой веÑÑÐ¸Ð½Ñ Ð³Ñани, вÑзÑÐ²Ð°Ñ gl.drawElements()
.
ÐамеÑим: ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ ÐºÐ°Ð¶Ð´ÑÑ Ð³ÑÐ°Ð½Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑеÑÑÑе веÑÑинÑ, но ÐºÐ°Ð¶Ð´Ð°Ñ Ð²ÐµÑÑина пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÑÑÑм гÑанÑм. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑедаваÑÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ менÑÑе даннÑÑ , поÑÑÑоив ÑпиÑок вÑÐµÑ 24-Ñ Ð²ÐµÑÑин, заÑем ÑÑÑлаÑÑÑÑ Ð½Ð° каждÑÑ Ð¸Ð· Ð½Ð¸Ñ Ð² ÑÑом ÑпиÑке по ÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ, вмеÑÑо Ñого ÑÑÐ¾Ð±Ñ Ð¿ÐµÑедаваÑÑ Ð²Ñе множеÑÑво веÑÑин. ÐÑли Ð²Ñ ÑдивленÑ, поÑÐµÐ¼Ñ Ð½Ð°Ð¼ нÑÐ¶Ð½Ñ 24 веÑÑинÑ, а не ÑолÑко 8, Ñак ÑÑо поÑомÑ, ÑÑо каждое ÑебÑо пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÑÑÑм гÑанÑм ÑазнÑÑ ÑвеÑов, и ÐºÐ°Ð¶Ð´Ð°Ñ Ð¾ÑделÑÐ½Ð°Ñ Ð²ÐµÑÑина должна имеÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑй оÑделÑнÑй ÑÐ²ÐµÑ - поÑÑÐ¾Ð¼Ñ Ð¼Ñ Ñоздадим 3 копии каждой веÑÑÐ¸Ð½Ñ ÑÑÑÑ ÑазнÑÑ ÑвеÑов, по одной Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ гÑани.
ÐпÑеделение позиÑий веÑÑин кÑбаÐо пеÑвÑÑ
, давайÑе поÑÑÑоим бÑÑÐµÑ Ð¿Ð¾Ð·Ð¸Ñий веÑÑин кÑба, обновив код в initBuffers()
. ÐÑо в знаÑиÑелÑной ÑÑепени Ñо же Ñамое как ÑÑо бÑло Ð´Ð»Ñ ÐºÐ²Ð°Ð´ÑаÑа, но неÑколÑко длиннее, Ñак как здеÑÑ 24 веÑÑÐ¸Ð½Ñ (4 Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑоÑонÑ):
var vertices = [
// ÐеÑеднÑÑ Ð³ÑанÑ
-1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0,
// ÐаднÑÑ Ð³ÑанÑ
-1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0,
// ÐеÑÑ
нÑÑ Ð³ÑанÑ
-1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0,
// ÐижнÑÑ Ð³ÑанÑ
-1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0,
// ÐÑÐ°Ð²Ð°Ñ Ð³ÑанÑ
1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0,
// ÐÐµÐ²Ð°Ñ Ð³ÑанÑ
-1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0,
];
ÐпÑеделение ÑвеÑов веÑÑин
Ðам Ñакже нÑжно поÑÑÑоиÑÑ Ð¼Ð°ÑÑив ÑвеÑов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ из 24-Ñ Ð²ÐµÑÑин. ÐÑÐ¾Ñ ÐºÐ¾Ð´ наÑинаеÑÑÑ Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑвеÑов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ гÑани, заÑем иÑполÑзÑеÑÑÑ Ñикл Ð´Ð»Ñ ÑоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива вÑе вÑÐµÑ ÑвеÑов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ из веÑÑин.
var colors = [
[1.0, 1.0, 1.0, 1.0], // Front face: white
[1.0, 0.0, 0.0, 1.0], // Back face: red
[0.0, 1.0, 0.0, 1.0], // Top face: green
[0.0, 0.0, 1.0, 1.0], // Bottom face: blue
[1.0, 1.0, 0.0, 1.0], // Right face: yellow
[1.0, 0.0, 1.0, 1.0], // Left face: purple
];
var generatedColors = [];
for (j = 0; j < 6; j++) {
var c = colors[j];
for (var i = 0; i < 4; i++) {
generatedColors = generatedColors.concat(c);
}
}
cubeVerticesColorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesColorBuffer);
gl.bufferData(
gl.ARRAY_BUFFER,
new Float32Array(generatedColors),
gl.STATIC_DRAW,
);
ÐпÑеделение маÑÑива ÑлеменÑов
Ðак ÑолÑко маÑÑив веÑÑин ÑгенеÑиÑован, нам нÑжно поÑÑÑоиÑÑ Ð¼Ð°ÑÑив ÑлеменÑов.
cubeVerticesIndexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVerticesIndexBuffer);
// ÐÑÐ¾Ñ Ð¼Ð°ÑÑив опÑеделÑÐµÑ ÐºÐ°Ð¶Ð´ÑÑ Ð³ÑÐ°Ð½Ñ ÐºÐ°Ðº два ÑÑеÑголÑника,
// иÑполÑзÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð² маÑÑиве веÑÑин, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð¿Ð¾Ð·Ð¸ÑиÑ
// каждого ÑÑеÑголÑника.
var cubeVertexIndices = [
0,
1,
2,
0,
2,
3, // front
4,
5,
6,
4,
6,
7, // back
8,
9,
10,
8,
10,
11, // top
12,
13,
14,
12,
14,
15, // bottom
16,
17,
18,
16,
18,
19, // right
20,
21,
22,
20,
22,
23, // left
];
// ТепеÑÑ Ð¾ÑпÑавим маÑÑив ÑлеменÑов в GL
gl.bufferData(
gl.ELEMENT_ARRAY_BUFFER,
new Uint16Array(cubeVertexIndices),
gl.STATIC_DRAW,
);
ÐаÑÑив cubeVertexIndices
опÑеделÑÐµÑ ÐºÐ°Ð¶Ð´ÑÑ Ð³ÑÐ°Ð½Ñ ÐºÐ°Ðº паÑÑ ÑÑеÑголÑников, ÑопоÑÑавлÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð¹ веÑÑине ÑÑеÑголÑника Ð¸Ð½Ð´ÐµÐºÑ Ð² маÑÑиве веÑÑин кÑба. Таким обÑазом кÑб можно пÑедÑÑавиÑÑ ÐºÐ°Ðº Ð½Ð°Ð±Ð¾Ñ Ð¸Ð· 12 ÑÑеÑголÑников.
Ðалее нам нÑжно обновиÑÑ ÐºÐ¾Ð´ наÑей ÑÑнкÑии drawScene()
, ÑÑÐ¾Ð±Ñ ÑиÑоваÑÑ, иÑполÑзÑÑ Ð±ÑÑÐµÑ Ð¸Ð½Ð´ÐµÐºÑов кÑба, добавив новÑе вÑÐ·Ð¾Ð²Ñ gl.bindBuffer()
и gl.drawElements()
:
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVerticesIndexBuffer);
setMatrixUniforms();
gl.drawElements(gl.TRIANGLES, 36, gl.UNSIGNED_SHORT, 0);
ÐоÑколÑÐºÑ ÐºÐ°Ð¶Ð´Ð°Ñ Ð³ÑÐ°Ð½Ñ Ð½Ð°Ñего кÑба ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· двÑÑ ÑÑеÑголÑников, где 6 веÑÑин на каждой гÑани, или вÑего 36 веÑÑин во вÑем кÑбе, даже еÑли многие из Ð½Ð¸Ñ Ð´ÑблиÑÑÑÑÑÑ. Ðднако, поÑколÑÐºÑ Ð½Ð°Ñ Ð¼Ð°ÑÑив индекÑов ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑелÑÑ ÑиÑел, ÑÑо не ÑÑезмеÑное колиÑеÑÑво даннÑÑ , поÑÑлаемÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ кадÑа анимаÑии.
РданнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð°Ð½Ð¸Ð¼Ð¸ÑованнÑй кÑб Ñ Ð³ÑанÑми 6 ÑазнÑÑ ÑвеÑов, коÑоÑÑй пÑÑÐ³Ð°ÐµÑ Ð¸ вÑаÑаеÑÑÑ.
View the complete code | Open this demo on a new page
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4