webgpu实现粒子颗粒化飘动动画效果代码

代码语言:html

所属分类:粒子

代码描述:webgpu实现粒子颗粒化飘动动画效果代码

代码标签: webgpu 粒子 颗粒化 飘动 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">

  
  
  
<style>
html,body {
  margin: 0;
  overflow: hidden;
}
canvas {
  width: 100%;
}
</style>


  
  
</head>

<body translate="no">
  <canvas></canvas>
  
      <script >
console.clear();

if (!navigator.gpu) {
  console.error("WebGPU not supported in this browser.");
  throw new Error("WebGPU not supported.");
}

async function initWebGPU() {
  const canvas = document.querySelector('canvas');
  const adapter = await navigator.gpu.requestAdapter();
  const device = await adapter.requestDevice();
  const context = canvas.getContext('webgpu');

  // Resize canvas to fit the window
  const dpi = 2;
  const resizeCanvas = () => {
    canvas.width = window.innerWidth * dpi;
    canvas.height = window.innerHeight * dpi;
  };
  resizeCanvas();
  window.addEventListener('resize', resizeCanvas);

  // Configure the canvas context
  const format = navigator.gpu.getPreferredCanvasFormat();
  context.configure({
    device: device,
    format: format,
    alphaMode: 'premultiplied' });


  return { device, context, format };
}
function createRenderLoop(device, context, positionBuffer, velocityBuffer, timeBuffer) {
  const shaderModule = createShaderModule(device);
  const pipeline = createRenderPipeline(device, shaderModule);

  const { computePipeline, bindGroup } = initComputePass(device, positionBuffer, velocityBuffer, timeBuffer);

  const renderBindGroupLayout = pipeline.getBindGroupLayout(0);
  const renderBindGroup = device.createBindGroup({
    layout: renderBindGroupLayout,
    entries: [{ binding: 0, resource: { buffer: positionBuffer } }] });


  let startTime = performance.now();

  const render = () => {
    const elapsedTime = (performance.now() - startTime) * .0001;
    device.queue.writeBuffer(timeBuffer, 0, new Float32Array([elapsedTime]));

    const commandEncoder = device.createCommandEncoder();

    // Compute Pass
    const computePass = commandEncoder.beginComputePass();
    computePass.setPipeline(computePipeline);
    computePass.setBindGroup(0, bin.........完整代码请登录后点击上方下载按钮下载查看

网友评论0