Таблиці швидкого довідника для 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 з їхніми базовими 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 у вершинному шейдері |
Вбудовані назви атрибутів, які розпізнають стандартні матеріали
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).
Зменшує кількість вершин за рахунок спільного використання.
|
Після зміни .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():
| Параметр | Запит |
|---|---|
| Макс. розмір текстури | 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 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
// 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
}
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);
// 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-буфери активними. Завжди
звільняйте геометрію, матеріали й текстури, які вам більше не
потрібні.
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