WebGL — browser ichida JavaScript orqali GPU yordamida ikki va uch o‘lchamli grafika render qilish imkonini beradigan web API. U OpenGL ESga yaqin graphics pipeline modelidan foydalanadi va HTML Canvas elementi ichida ishlaydi.
WebGL game, 3D model, map, scientific visualization, image processing va murakkab animationlarda qo‘llanadi.
Context
Canvasdan WebGL context olinadi:
const gl = canvas.getContext("webgl2");
WebGL 1 va WebGL 2 imkoniyatlari farq qiladi.
Context olinmasa browser, driver yoki policy API’ni qo‘llamasligi mumkin.
Fallback ko‘rsatiladi.
GPU pipeline
Soddalashtirilgan rendering oqimi:
- vertex data;
- vertex shader;
- primitive assembly;
- rasterization;
- fragment shader;
- blending;
- framebuffer.
Developer buffer, shader, texture va state’ni boshqaradi.
Vertex
Vertex geometriyaning nuqtasini ifodalaydi.
U:
- position;
- normal;
- color;
- texture coordinate;
- custom attribute
ga ega bo‘lishi mumkin.
Vertexlar bufferda GPUga uzatiladi.
Buffer
WebGL buffer binary data’ni GPUga saqlaydi.
JavaScript typed array:
new Float32Array(...)
orqali vertex data tayyorlaydi.
ARRAY_BUFFER attribute, ELEMENT_ARRAY_BUFFER index data uchun ishlatiladi.
Vertex shader
Vertex shader har vertex uchun ishlaydi.
U vertex positionini clip space’ga aylantiradi va fragment bosqichiga varying qiymatlar uzatadi.
Shader GLSL ES tilida yoziladi.
Shader compile xatosi log orqali tekshiriladi.
Fragment shader
Fragment shader rasterizatsiyadan keyingi har fragment rangini hisoblaydi.
U:
- texture;
- light;
- material;
- color;
- effect
bilan ishlaydi.
Final pixel blending va depth testdan o‘tishi mumkin.
Shader program
Vertex va fragment shader compile qilinib programga link qilinadi.
Attribute va uniform locationlari olinadi.
Renderdan oldin program aktiv qilinadi.
Har frame’da shaderni qayta compile qilish samarasiz.
Attribute
Attribute vertexdan vertexga o‘zgaradigan data.
Masalan:
- position;
- color;
- UV coordinate.
Buffer layout, type, stride va offset bilan shader attribute’iga bog‘lanadi.
Noto‘g‘ri stride geometriyani buzadi.
Uniform
Uniform draw call davomida ko‘p vertex va fragmentlar uchun bir xil qiymat.
Misollar:
- transform matrix;
- vaqt;
- light position;
- texture sampler;
- rang.
Har object yoki frame uchun uniform yangilanishi mumkin.
Matrix
3D transform odatda matrix bilan bajariladi:
Model objectni worldga, view camera koordinatasiga, projection clip space’ga olib keladi.
Matrix multiplication tartibi library conventioniga bog‘liq.
Texture
Texture image yoki generated pixel data’ni GPUga beradi.
Parametrlar:
- filtering;
- wrapping;
- mipmap;
- format;
- size.
Cross-origin image CORS qoidalariga bo‘ysunadi.
Texture dimension va format device limitiga ega.
Depth test
3D scene’da yaqin fragment uzoq fragmentni yopishi kerak.
Depth buffer har pixelga chuqurlik saqlaydi.
Depth test yoqiladi va har frame tozalanadi.
Transparent objectlar alohida sorting talab qilishi mumkin.
Blending
Blending yangi fragment rangini framebufferdagi rang bilan birlashtiradi.
Alpha transparency keng misol.
Blend function noto‘g‘ri sozlansa rang va opacity kutilmagan bo‘ladi.
Premultiplied alpha tushunchasi image pipeline’da muhim.
Framebuffer
Default framebuffer canvasga chiqaradi.
Offscreen framebuffer texture yoki renderbufferga chizish imkonini beradi.
Bu:
uchun ishlatiladi.
Animation
Render loop:
requestAnimationFrame(render);
orqali ishlaydi.
Har frame state yangilanadi va draw call bajariladi.
Scene o‘zgarmasa doimiy redraw shart bo‘lmasligi mumkin.
Draw call
GPUga geometriya chizish commandi draw call.
Juda ko‘p kichik draw call CPU-GPU overheadni oshiradi.
Batching, instancing va state change kamaytirish performance’ni yaxshilaydi.
Context loss
Browser yoki driver GPU contextni yo‘qotishi mumkin.
Sabablar:
Application webglcontextlost va restore hodisalarini boshqarib resource’larni qayta yaratadi.
Security
WebGL shader va driver bilan ishlagani sabab browser inputni validate va sandbox qiladi.
Untrusted shader:
yaratmasligi uchun limitlar mavjud.
Browser va GPU driver yangilanishi muhim.
WebGL va Canvas 2D
Canvas 2D yuqori darajadagi shape va image API beradi.
WebGL pastroq darajadagi GPU pipeline.
Oddiy chart uchun Canvas 2D osonroq.
Ko‘p object, 3D va custom shader uchun WebGL kuchliroq.
WebGL va WebGPU
WebGPU zamonaviy GPU API’lariga yaqinroq model, compute shader va explicit resource boshqaruvini beradi.
WebGL kengroq browser va eski device supportiga ega.
Migration framework va workloadga bog‘liq.
Instancing
Bir xil geometriyani ko‘p marta boshqa transform yoki rang bilan chizish uchun instanced rendering ishlatiladi. Bitta draw call ko‘p instance yaratib CPU overheadni kamaytiradi. Per-instance attribute bufferda saqlanadi.
Picking
User qaysi 3D obyektni bosganini aniqlash uchun ray casting yoki offscreen color picking ishlatilishi mumkin. Color picking har obyektni unique rang bilan framebufferga chizib, click pixelini o‘qiydi. High-DPI va asynchronous read performance hisobga olinadi.
Resource cleanup
Buffer, texture, shader va framebuffer JavaScript reference yo‘qolganda darhol GPUdan o‘chmasligi mumkin. deleteBuffer, deleteTexture va boshqa cleanup methodlari uzoq ishlaydigan applicationda GPU memory leakni kamaytiradi.
Extension
WebGL qo‘shimcha imkoniyatlarni extension orqali beradi. Application extension mavjudligini tekshiradi va fallback ishlatadi. Extension nomi hamda support WebGL versiyasiga bog‘liq.
Bog‘liq tushunchalar
Web Graphics Library, GPU, Shader, Vertex, Fragment, Texture, Buffer, GLSL, Canvas, WebGPU, 3D rendering