Довідник Оновлено в червні 2026 · Three.js r160 · WebGL 2

Шпаргалка з WebGL і Three.js

Таблиці швидкого довідника для Three.js r160 та чистого WebGL 2. Прапорці рендера, атрибути геометрії, формати текстур, апаратні обмеження, поширені патерни та корисні розширення — усе на одній сторінці.

🖥 Прапорці рендера

Передавайте ці опції в конструктор WebGLRenderer. Більшість із них впливають на продуктивність.

Опція Усталено Призначення та нотатки
antialias false MSAA-згладжування. Безкоштовне на десктопних GPU. Дороге на мобільних — натомість використовуйте постобробку FXAA.
alpha false Прозорий фон <canvas>. Вимагає premultipliedAlpha: true, щоб уникнути облямівки по краях.
premultipliedAlpha true Усталене для WebGL. Лишайте true, якщо не компонуєте поверх CSS-фонів.
stencil true Виділяє трафаретний буфер. Встановіть false, якщо не використовуєте його, щоб заощадити VRAM.
depth true Буфер глибини. Завжди потрібен для 3D.
logarithmicDepthBuffer false Усуває z-fighting на екстремальних діапазонах near/far (наприклад, космічні сцени). Вимикає gl_FragDepth у шейдерах.
powerPreference "default" "high-performance" запитує дискретний GPU на ноутбуках. Використовуйте для важких симуляцій.
failIfMajorPerformanceCaveat false Повертає null-контекст, якщо немає апаратного прискорення.

Властивості рендера, які слід встановити після створення

Властивість / метод Рекомендоване значення Навіщо
setPixelRatio(Math.min(devicePixelRatio,2)) Обмежує до 2× DPR; екрани 4× не дають візуального виграшу, але коштують 4× заповнення.
outputColorSpace THREE.SRGBColorSpace Потрібне для фізично коректного виводу кольору (усталено з r152).
shadowMap.enabled true лише за потреби Кожне джерело, що відкидає тінь, додає повний прохід рендеру.
shadowMap.type THREE.PCFSoftShadowMap Гладкіші краї, ніж усталений PCF.
toneMapping THREE.ACESFilmicToneMapping Відображення HDR → LDR для реалістичного світла неба/оточення.
toneMappingExposure 1.0 Підлаштуйте під яскравість сцени.

🔗 Відповідники Three.js → чистий WebGL

Three.js обгортає кожну концепцію WebGL. Ця таблиця зіставляє класи Three з їхніми базовими GL-викликами — корисно під час написання власних шейдерних проходів або налагодження.

Three.js Чистий WebGL 2 Нотатки
WebGLRenderer WebGL2RenderingContext Отримується через canvas.getContext('webgl2')
BufferGeometry VAO + VBO gl.createVertexArray() + gl.createBuffer()
BufferAttribute VBO gl.bufferData(gl.ARRAY_BUFFER, …)
ShaderMaterial WebGLProgram gl.createShader() + gl.createProgram()
uniform у ShaderMaterial gl.uniform*() Three автоматично завантажує кожен кадр, якщо позначено «брудним»
DataTexture WebGLTexture gl.texImage2D(gl.TEXTURE_2D, …)
WebGLRenderTarget FBO (WebGLFramebuffer) gl.createFramebuffer() + gl.framebufferTexture2D()
Points gl.drawArrays(gl.POINTS, …) Один виклик відмалювання, gl_PointSize у вершинному шейдері
InstancedMesh gl.drawElementsInstanced() Вимагає gl_InstanceID у вершинному шейдері

📐 Атрибути BufferGeometry

Вбудовані назви атрибутів, які розпізнають стандартні матеріали Three.js. Власні шейдери можуть використовувати будь-яку назву — підключайте їх через geometry.setAttribute('name', attr).

Назва атрибута itemSize Назва в GLSL Нотатки
position 3 attribute vec3 position Обовʼязковий. Позиції вершин у світовому просторі.
normal 3 attribute vec3 normal Обовʼязковий для освітлення. Автоматично обчислюється geometry.computeVertexNormals().
uv 2 attribute vec2 uv Текстурні координати для каналу мапи 0.
uv1 2 attribute vec2 uv1 Другий набір UV (lightmap, AO-мапа).
color 3 attribute vec3 color Колір на вершину. Увімкніть через material.vertexColors = true.
tangent 4 attribute vec4 tangent Для карт нормалей. Автоматично через geometry.computeTangents() (потрібні UV + нормалі).
index 1 Встановлюється через geometry.setIndex(attr). Зменшує кількість вершин за рахунок спільного використання.
needsUpdate

Після зміни .array у BufferAttribute з JS завжди встановлюйте attribute.needsUpdate = true. Без цього GPU продовжує читати старі дані зі свого буфера.

🖼 Формати текстур

Константа Three Внутрішній формат GL Випадок використання
THREE.RGBAFormat gl.RGBA8 Усталені кольорові текстури (8 біт на канал).
THREE.RGBFormat gl.RGB8 Непрозорий колір (без альфи). Трохи менше VRAM.
THREE.RedFormat gl.R8 Одноканальні маски, мапи висот.
THREE.RGBAFormat + HalfFloatType gl.RGBA16F HDR-рендер-цілі, ping-pong для bloom.
THREE.RGBAFormat + FloatType gl.RGBA32F Високоточні GPGPU-текстури позиції / швидкості.
THREE.DepthFormat gl.DEPTH_COMPONENT24 Прикріплення глибини на рендер-цілях.
RGBA_S3TC_DXT5_EXT Стиснений Стиснений RGBA — вимагає EXT_texture_compression_s3tc.

Параметри текстур

const tex = new THREE.TextureLoader().load('diffuse.webp');

tex.colorSpace  = THREE.SRGBColorSpace;       // only for colour maps
tex.wrapS       = THREE.RepeatWrapping;        // horizontal repeat
tex.wrapT       = THREE.RepeatWrapping;        // vertical repeat
tex.repeat.set(4, 4);                       // tile 4×4
tex.minFilter   = THREE.LinearMipmapLinearFilter;
tex.magFilter   = THREE.LinearFilter;
tex.anisotropy  = renderer.capabilities.maxAnisotropy; // sharpness at angles

⚙ Апаратні обмеження

Запитуйте їх під час виконання через renderer.capabilities або чистий gl.getParameter():

16
макс. текстурних блоків (фрагментний)
8 k–16 k
макс. розмір текстури (px)
65 535
макс. індекс (Uint16) → використовуйте Uint32
256
макс. вершинних атрибутів
255
макс. буферів відмалювання (MRT)
16 384+
макс. varying-векторів
Параметр Запит
Макс. розмір текстури renderer.capabilities.maxTextureSize
Макс. анізотропія renderer.capabilities.maxAnisotropy
Доступність WebGL 2 renderer.capabilities.isWebGL2
Макс. вершинних юніформів gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS)
Макс. фрагментних юніформів gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS)
Макс. буферів відмалювання gl.getParameter(gl.MAX_DRAW_BUFFERS)

🔌 Корисні розширення WebGL

Розширення — це опціональні можливості. У WebGL 2 багато колишніх розширень тепер увійшли до ядра, але деякі все ще потребують явного увімкнення.

Розширення Статус Що вмикає
EXT_color_buffer_float WGL2 Рендеринг у float-текстури (RGBA32F). Потрібне для GPGPU-обчислень.
EXT_color_buffer_half_float WGL2 Рендеринг у half-float текстури — bloom, HDR.
OES_texture_float_linear опціональне Білінійна фільтрація float-текстур. Не гарантується на мобільних.
EXT_texture_filter_anisotropic опціональне Анізотропна фільтрація — різкіші текстури поверхні під гострими кутами.
WEBGL_multi_draw опціональне Виконати кілька викликів відмалювання в одному GL-виклику. Зменшує навантаження на CPU.
EXT_texture_compression_s3tc опціональне Стиснені текстури DXT1/3/5 (лише десктоп).
WEBGL_compressed_texture_astc опціональне Стиснені текстури ASTC (мобільні / Apple Silicon).
KHR_parallel_shader_compile опціональне Неблокуюча компіляція шейдерів — перевіряйте через getParameter(COMPLETION_STATUS_KHR).

Перевірте доступність:

const ext = renderer.extensions.get('EXT_color_buffer_float');
if (!ext) console.warn('Float render targets not supported');

💡 Поширені патерни

Рендер-ціль (позаекранний фреймбуфер)

const rt = new THREE.WebGLRenderTarget(width, height, {
  type: THREE.HalfFloatType,
  format: THREE.RGBAFormat,
  minFilter: THREE.LinearFilter,
  magFilter: THREE.LinearFilter,
  depthBuffer: false,   // skip if no depth test needed
});

renderer.setRenderTarget(rt);
renderer.render(scene, camera);
renderer.setRenderTarget(null); // restore default framebuffer

GPGPU ping-pong (фізика частинок на GPU)

// Two render targets — swap each frame
let [rtA, rtB] = [makeRT(), makeRT()];

function compute() {
  // rtA = read (previous positions), rtB = write (new positions)
  computeMaterial.uniforms.tPrev.value = rtA.texture;
  renderer.setRenderTarget(rtB);
  renderer.render(quadScene, orthoCamera);
  renderer.setRenderTarget(null);
  [rtA, rtB] = [rtB, rtA]; // swap
}

InstancedMesh — 100 тис. обʼєктів, один виклик відмалювання

const mesh = new THREE.InstancedMesh(geometry, material, COUNT);
const matrix = new THREE.Matrix4();

for (let i = 0; i < COUNT; i++) {
  matrix.setPosition(positions[i]);
  mesh.setMatrixAt(i, matrix);
}
mesh.instanceMatrix.needsUpdate = true;
scene.add(mesh);

Звільнення для вивільнення памʼяті GPU

// Always dispose when removing objects from the scene
geometry.dispose();
material.dispose();
texture.dispose();
renderTarget.dispose();
renderer.dispose(); // when tearing down the whole renderer
Витоки памʼяті трапляються часто

Обʼєкти Three.js, які видалено зі сцени, але не звільнено через dispose(), залишають свої GPU-буфери активними. Завжди звільняйте геометрію, матеріали й текстури, які вам більше не потрібні.

Перевірка версії WebGL під час виконання

const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2');
if (!gl) {
  console.warn('WebGL 2 unavailable — falling back to WebGL 1');
}
// OR use Three's abstraction:
const renderer = new THREE.WebGLRenderer();
console.log(renderer.capabilities.isWebGL2); // true / false