首页 > 其他分享 >webgpu用最简短的代码画一个三角形

webgpu用最简短的代码画一个三角形

时间:2023-10-23 19:44:07浏览次数:32  
标签:const 渲染 0.0 webgpu 简短 device 顶点 三角形 着色器

1.包含webgpu的初始化

2.三角形顶点缓冲的创建以及将cpu数据填充到gpu里

3.webgpu里着色器的编写,以及通过代码创建webgpu的着色器程序对象

4.通过顶点和像素阶段的描述创建一个渲染管线

话不多说直接贴代码:

<html> <head>   <meta charset="utf-8">   <title>WebGPU Hello Triangle</title>   <style> body {     font-family: system-ui;     color: #f7f7ff;     background-color: rgb(38, 38, 38);     text-align: center; }
canvas {     display: block;     margin: 0 auto;     width: 100%;     height: 100%; }   </style>   <script type="module">     // 获取canvas元素     const canvas = document.getElementById("canvas");     canvas.width = window.innerWidth;     canvas.height = window.innerHeight;     // 获取WebGPU上下文     const context = canvas.getContext("webgpu");     // 定义顶点数据,三个顶点组成一个三角形     const vertices = new Float32Array([       -0.5, -0.5,   1.0, 0.0, 0.0, 1.0, // 左下角       0.5, -0.5,   0.0, 1.0, 0.0, 1.0, // 右下角       0.0, 0.5,   0.0, 0.0, 1.0, 1.0, // 顶点     ]);     // 定义顶点着色器代码,使用WGSL语言     const wgslSource = `         struct Vertex {             @builtin(position) Position: vec4<f32>, // 顶点着色器输出的位置             @location(0) color: vec4<f32>,          // 顶点着色器输出的颜色         }         // 顶点着色器         @vertex fn vsmain(             @builtin(vertex_index) VertexIndex: u32,    // 顶点着色器内建的顶点索引             @location(0) position: vec2<f32>,   // 输入顶点的位置             @location(1) color: vec4<f32>                   // 输入顶点的颜色         ) -> Vertex         {             var vertex_out : Vertex;             vertex_out.Position = vec4<f32>(position, 0.0, 1.0);             vertex_out.color = color;             return vertex_out;         }         // 像素着色器         @fragment fn fsmain(in: Vertex) -> @location(0) vec4<f32>         {             return in.color;         }     `;     // 初始化WebGPU相关对象     async function initWebGPU() {         // 获取适配器对象,表示GPU的物理设备         const adapter = await navigator.gpu.requestAdapter();         // 获取设备对象,表示GPU的会话         const device = await adapter.requestDevice();         // 配置上下文对象,指定设备和像素格式         const format = "bgra8unorm";         context.configure({             device: device,             format: format,         });         // 创建顶点缓冲区,用于存储顶点数据         const vertexBuffer = device.createBuffer({             size: vertices.byteLength,             usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,             mappedAtCreation: true,         });         new Float32Array(vertexBuffer.getMappedRange()).set(vertices);         vertexBuffer.unmap();         // 创建着色器模块,用于编译着色器代码         const shaderModule = device.createShaderModule({ code: wgslSource });         // 定义顶点输入的数据布局,以及顶点着色阶段的其它信息         const vertexSize = 4 * 6;         const colorOffset = 4 * 2;         const positionAttributeState = {             format: "float32x2",             offset: 0,             shaderLocation: 0,         };         const colorAttributeState = {             format: "float32x4",             offset: colorOffset,             shaderLocation: 1,         }         const vertexBufferState = {             arrayStride: vertexSize,             stepMode: "vertex",             attributes: [positionAttributeState, colorAttributeState], // 顶点输入属性包含一个位置和颜色         };
        const vertexStageDescriptor = {             buffers: [vertexBufferState], // 顶点着色的顶点缓冲             module: shaderModule,       // 顶点着色的shader             entryPoint: "vsmain"        // 入口函数         };
        const fragmentStageDescriptor = {             module: shaderModule,             entryPoint: "fsmain",             targets: [ {format: "bgra8unorm" }, ],             };         const renderPipelineDescriptor = {             layout: 'auto',             vertex: vertexStageDescriptor,             fragment: fragmentStageDescriptor,             primitive: {topology: "triangle-list" },         };         // 创建渲染管线,用于指定渲染流程和状态         const pipeline = device.createRenderPipeline(renderPipelineDescriptor);         return { device, pipeline, vertexBuffer }; // 返回相关对象     }     // 渲染函数,用于绘制图形     function render({ device, pipeline, vertexBuffer }) {       // 获取颜色纹理,用于存储渲染结果       const textureView = context.getCurrentTexture().createView();       // 创建命令编码器,用于记录渲染命令       const commandEncoder = device.createCommandEncoder();       const colorAttachmentDescriptor = {             view: textureView,             loadOp: "clear",             storeOp: "store",             clearColor: [0.5, 0.5, 0.5, 1]         };       /* GPURenderPassDescriptor */       const renderPassDescriptor = { colorAttachments: [colorAttachmentDescriptor] };       // 开始一个渲染通道,指定颜色附件和清除颜色       const renderPass = commandEncoder.beginRenderPass(renderPassDescriptor);       // 设置渲染管线       renderPass.setPipeline(pipeline);       // 设置顶点缓冲区       renderPass.setVertexBuffer(0, vertexBuffer);       // 绘制三个顶点,组成一个三角形       renderPass.draw(3, 1, 0, 0);       // 结束渲染通道       renderPass.end();       // 结束命令编码器,获取命令缓冲区       const commandBuffer = commandEncoder.finish();       // 将命令缓冲区提交给GPU队列,执行渲染命令       device.queue.submit([commandBuffer]);     }     // 调用初始化函数,然后调用渲染函数     initWebGPU().then(render);   </script> </head> <body>   <canvas id="canvas" ></canvas> </body> </html> 效果如下:

 

 

标签:const,渲染,0.0,webgpu,简短,device,顶点,三角形,着色器
From: https://www.cnblogs.com/zzatp/p/17783299.html

相关文章

  • 关于三角形的四种心(外心,内心,重心,垂心)
    外心三条边垂直平分线的交点为外心。到三顶点距离相等内心三条内角平分线的交点为内心。到三条边的距离相等同时是内切圆的圆心重心三条中心的交点为重心同时是物理意义上的重心公式:\(G(x_0,y_0),x_0=\frac{x_1+x_2+x_3}{3},y_0=\frac{y_1+y_2+y_3}{3}\)垂心......
  • 利用 CSS 的 clip-path 属性快速画三角形、气泡框
    clip-path 结合polygon函数,可以快速切出一个三角形、气泡框。a.三角形有三个顶点,因此 polygon 需要传三个参数,每个参数是顶点的x和y轴位置百分比:#triangle-1{-webkit-clip-path:polygon(50%0,100%100%,0100%);clip-path:polygon(50%0,100%100%,......
  • 习题专题2-习题1 计算三角形面积
    给定三点坐标计算三角形面积有两个考点:考点一:两点间距离公式考点二:海伦公式海伦公式:abc为三边长p=(a+b+c)/2S=√p(p-a)(p-b)(p-c)//考点一:两点间距离公式//考点二:海伦公式#include<math.h>#include<stdio.h>intmain(){ doublea1,a2,b1,b2,c1,c2; doublex1......
  • 力扣-120. 三角形最小路径和
    题目描述给定一个三角形triangle,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点在这里指的是下标与上一层结点下标相同或者等于上一层结点下标+1的两个结点。也就是说,如果正位于当前行的下标i,那么下一步可以移动到下一行的下标i或i+1。示例1:......
  • 二次函数与三角形面积最大值
    引入如图\((1)\),已知抛物线\(y=x^2-2x+c\)与\(x\)轴交\(A\),\(B\)两点,与\(y\)轴交于\(C\)点,抛物线的顶点为\(D\)点,点\(A\)的坐标为\((1,0)\)。\((1)\)求点\(D\)的坐标。\((2)\)若\(M\)为直线\(BC\)下方抛物线上一动点,当\(\bigtriangleupMCB\)面积最大......
  • 洛谷B2005 字符三角形(python)
    这题重点在如果输入print(a,a,a,a,a),逗号会使输出的时候五个字符之间有空格,应该用a+a+a+a+a。代码如下a=input();print(""+a)print(""+a+a+a)print(a+a+a+a+a) ......
  • 三角形最小路径和
    题目链接120.三角形最小路径和解题过程我觉得这道题已经可以当作如何优化动态规划的经典例题了,首先从路径上采用的是从上到下的方式,我是用了我自己能想出来的方法,也就是二维数组去解决的,接下来进行优化,将O(n2)的空间复杂度降低为O(n),使用2n的空间存储状态,接下来再次进行优化,......
  • 12_打印三角形
    一.打印三角1.图一#!/bin/bash#1#22#333#4444#55555#666666#7777777#88888888#999999999foriin$(seq9);dofor((j=1;j<=i;j++));doecho-n"$i"doneecho""done2.第二个图#!/bin/bash#|_#||......
  • WEBGpu最佳实践之BindGroup
    介绍在WebGPU中,资源通过GPUBindGroup结构传递给着色器,与支持它的布局定义(GPUBindGroupLayout和GPUPipelineLayout)以及着色器中绑定组的声明一起。这三者——着色器、布局和绑定组——都需要相互兼容,通常在每个阶段都需要重复信息。因此,这个API的这一方面乍一看可能感觉不必要地复......
  • 【JAVA】打印一个三角形(5行)
    需求打印一个三角形,实现效果和如图所示 思路分析分成三部分,左边一个透明倒三角,然后两个直角三角拼接外循环为每一行,执行完内循环后换行 代码实现for(inti=1;i<=5;i++){     for(intj=5;j>=i;j--){//最左侧的透明三角    ......