yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
89dd2b127
master
1"use strict" ; 2 3let Example = { 4initialize :async function ( canvas ) { 5async function render ( shaders ) { 6if ( ! navigator . gpu ) { 7throw new Error ( "WebGPU not supported on this browser." ); 8} 9const adapter = await navigator . gpu . requestAdapter (); 10if ( ! adapter ) { 11throw new Error ( "No appropriate GPUAdapter found." ); 12} 13const device = await adapter . requestDevice (); 14const context = canvas . getContext ( "webgpu" ); 15const canvasFormat = navigator . gpu . getPreferredCanvasFormat (); 16context . configure ({ 17device :device , 18format :canvasFormat , 19}); 20 21const vertexBufferLayout = { 22arrayStride :8 , 23attributes :[{ 24format :"float32x2" , 25offset :0 , 26shaderLocation :0 , 27}], 28}; 29 30const pipeline = device . createRenderPipeline ({ 31label :"Pipeline" , 32layout :"auto" , 33vertex :{ 34module :device . createShaderModule ({ 35label :"Vertex shader module" , 36code :shaders . vertex 37}), 38entryPoint :"vertexMain" , 39buffers :[ vertexBufferLayout ] 40}, 41fragment :{ 42module :device . createShaderModule ({ 43label :"Fragment shader module" , 44code :shaders . fragment 45}), 46entryPoint :"fragmentMain" , 47targets :[{ 48format :canvasFormat 49}] 50} 51}); 52 53const vertices = new Float32Array ([ 540.0 , - 0.8 , 55+ 0.8 , + 0.8 , 56- 0.8 , + 0.8 , 57]); 58const vertexBuffer = device . createBuffer ({ 59label :"Triangle vertices" , 60size :vertices . byteLength , 61usage :GPUBufferUsage . VERTEX | GPUBufferUsage . COPY_DST , 62}); 63const bufferOffset = 0 ; 64device . queue . writeBuffer ( vertexBuffer , bufferOffset , vertices ); 65 66const encoder = device . createCommandEncoder (); 67const pass = encoder . beginRenderPass ({ 68colorAttachments :[{ 69view :context . getCurrentTexture (). createView (), 70loadOp :"clear" , 71clearValue :{ r :0 , g :0 , b :0 , a :1 }, 72storeOp :"store" , 73}] 74}); 75pass . setPipeline ( pipeline ); 76const vertexBufferSlot = 0 ; 77pass . setVertexBuffer ( vertexBufferSlot , vertexBuffer ); 78pass . draw ( vertices . length / 2 ); 79pass . end (); 80const commandBuffer = encoder . finish (); 81device . queue . submit ([ commandBuffer ]); 82} 83 84render ({ 85vertex :await fetch ( "shader.vertex.wgsl" ). then ( r => r . text ()), 86fragment :await fetch ( "shader.fragment.wgsl" ). then ( r => r . text ()), 87}); 88} 89}