webgl(二):webgl绘制四边形

Canvas自定义画笔,绘制四边形 四边形绘制之后,显示每条线的中垂线;点击四边形内部,显示顶点并可移动四边形;拖动顶点,可拉伸四边形 <template> <div> <!-- 画布 --> <canvas id="myCanvas" width="960" height="540"> </canvas> <!-- 重新绘制按钮 --> <Button @click="creatDraw">重新绘制</Bu 阅读详情

一、搭建canvas环境

1) 创建<canvas>标签,指定绘图范围。     
2 )获取<canvas>标签。   
3 )获取webgl上下文   
4 )设置背景颜色
5) 清空<canvas>

为了条理清除,我们分别创建一个index.html和main.js文件;

1、index.html文件
<!-- index.html文件  -->
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>绘制四边形 </title>
</head>
<!--页面加载完成后,执行JavaScript中的main()函数-->
<body οnlοad="main()">
<!--定义<canvas>标签,通过width属性和height属性规定它是一片400×400的绘制区域-->
<canvas id="myCanvas" width="400" height="400">
    <!--当浏览器不支持时,会直接忽略<canvas>标签,而直接显示下面这一行提示-->
    Please use a browser that supports "canvas".
</canvas>
</body>
<!--  加载js文件-->
<script src="main.js"></script>
</html>

2、 main.js文件
//main.js 文件
function main() {
    var canvas = document.getElementById("myCanvas"); //获取<canvas>标签
    //如果没找到<canvas>标签,则输出错误信息
    if (!canvas) {
        console.log('Failed to retrieve the <canvas> element.');
        return;
    }
    //获取绘图上下文,“webgl”代表我们用webgl绘制图形。
    var gl = canvas.getContext("webgl");
    //设置背景颜色 参数是 颜色三元素R G B 和透明度A 
    gl.clearColor(1.0,0.0,0.0,1.0); 
    //清除背景颜色缓存,就显示我们设置的背景颜色
    gl.clear(gl.COLOR_BUFFER_BIT); 
}
3、效果图

在这里插入图片描述

二、绘制四边形

在index.html 中创建顶点着色器和片段着色器

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>绘制四边形 </title>

    <!-- 顶点着色器 -->
    <script id="shader-vs" src="vshader.js" type="x-shader/x-vertex">
       attribute vec3 aVertexPosition;
       void main() {
           // 直接将外部传入的顶点坐标作为最终坐标
           gl_Position = vec4(aVertexPosition, 1.0);
       }
    </script>

    <!-- 片段着色器 -->
    <script id="shader-fs" type="x-shader/x-fragment">
        // 设定 float 的精度, 这里我们使用中等精度
        precision mediump float;

        void main() {
            // 输出为纯白色
            gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
        }
    </script>
    <!--  加载js文件-->
    <script src="main.js"></script>
</head>
<!--页面加载完成后,执行JavaScript中的main()函数-->
<body onload="main()">
<!--定义<canvas>标签,通过width属性和height属性规定它是一片400×400的绘制区域-->
<canvas id="myCanvas" width="800" height="600">
    <!--当浏览器不支持时,会直接忽略<canvas>标签,而直接显示下面这一行提示-->
    Please use a browser that supports "canvas".
</canvas>
</body>
</html>

在main.js中
1、加载shader
2、加载顶点数据缓存
3、设置webgl初始化状态
4、绘制四边形
完整代码如下:

var gl;
var canvas;
var shaderProgram;
var vertexBuffer;
var vertexIndexBuffer;
//加载shader
function setupShaders() {
    // 从 DOM 上创建对应的着色器
    vertexShader = loadShaderFromDOM("shader-vs");
    fragmentShader = loadShaderFromDOM("shader-fs");

    // 创建程序并连接着色器
    shaderProgram = gl.createProgram();
    gl.attachShader(shaderProgram, vertexShader);
    gl.attachShader(shaderProgram, fragmentShader);
    gl.linkProgram(shaderProgram);

    // 连接失败的检测
    if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
        alert("Failed to setup shaders");
    }

    // 使用着色器
    gl.useProgram(shaderProgram);

    // 创建动态属性获取着色器中 aVertexPosition 属性的位置
    shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
}
//读取shader字符内容
function loadShaderFromDOM(id) {
    // 获取 DOM
    var shaderScript = document.getElementById(id);

    if (!shaderScript) {
        return null;
    }

    // 获取着色器代码
    var shaderSource = "";
    var currentChild = shaderScript.firstChild;
    while (currentChild) {
        if (currentChild.nodeType == 3) { // 3 corresponds to TEXT_NODE
            shaderSource += currentChild.textContent;
        }
        currentChild = currentChild.nextSibling;
    }

    // 创建着色器
    var shader;
    if (shaderScript.type == "x-shader/x-fragment") {
        shader = gl.createShader(gl.FRAGMENT_SHADER);
    } else if (shaderScript.type == "x-shader/x-vertex") {
        shader = gl.createShader(gl.VERTEX_SHADER);
    } else {
        return null;
    }

    // 编译着色器
    gl.shaderSource(shader, shaderSource);
    gl.compileShader(shader);

    // 判断编译是否成功
    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
        alert(gl.getShaderInfoLog(shader));
        return null;
    }
    return shader;
}

//初始化顶点缓存数据
function setupBuffers() {

    // 定义顶点数据
    var triangleVertices = [
        0.5, 0.5, 0.0,
        0.5, -0.5, 0.0,
        -0.5, -0.5, 0.0,
        -0.5, 0.5, 0.0
    ];
    var triangleIndex = [
        0,1,2,
        0,2,3
    ]
    // 创建顶点缓冲
    vertexBuffer = gl.createBuffer();
    // 绑定顶点缓冲
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    // 提交顶点数据
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW);
    vertexBuffer.itemSize = 3;
    vertexBuffer.numberOfItems = 3;

    //创建顶点索引
    vertexIndexBuffer = gl.createBuffer();
    // 绑定顶点索引
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,vertexIndexBuffer);
    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,new Uint16Array(triangleIndex),gl.STATIC_DRAW);


}
//绘图
function draw() {
    // 设置视口大小, 使用像素, 调整该大小不影响显示内容,只影响图像在 Canvas 上显示的位置和尺寸
    gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
    // 清除颜色缓冲
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,vertexIndexBuffer);
    // 将提交的顶点数据绑定到着色器的 aVertexPosition 属性
    gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, vertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
    // 开启属性 aVertexPosition 的使用
    gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
    // 绘制图像
    gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0);
}

function main() {
    canvas = document.getElementById("myCanvas");
    //如果没找到<canvas>标签,则输出错误信息
    if (!canvas) {
        console.log('Failed to retrieve the <canvas> element.');
        return;
    }
    //获取绘图上下文,“webgl”代表我们用webgl绘制图形。
    gl = canvas.getContext("webgl");
    gl.viewportWidth = canvas.width;
    gl.viewportHeight = canvas.height;
    setupShaders();//加载并创建shader
    setupBuffers();//加载图形数据
    // 定义清除颜色缓冲之后的填充色为黑色
    gl.clearColor(0.0, 0.0, 0.0, 1.0);
    draw();//绘图
}

效果图如下:

在这里插入图片描述

webgl(一):开发环境配置 1、开发工具 浏览器采用google浏览器 编译器采用webstorm软件 Google浏览器设置支持webgl : . 1: 打开浏览器并输入 about:flags 2:把第一个选项修改为 Enabled ... 阅读详情

相关推荐

第三节 WebGL中使用gl.drawArrays()和gl.drawElements()绘制图形

学习交流欢迎加群:789723098,博主会将一些demo整理共享 我们可能都知道,很多三维模型构成的基本单位都是三角形(三角面片),例如.stl和.obj这两种应用广泛的三维模型文件格式。再复杂的模型都可以由三角面片来组成,由此可见三角形在图形学中的重要地位。而且WebGL里面除了支持点(gl.POINTS)、线(gl.LINES、gl.LINE_STRIP和gl.LINE_LOOP),就是三...

Bruce_wjh的博客 8133

webGL编程指南 第三章 绘制四角形.helloQuadjs(加餐)

本节中我们还是使用4个顶点,放在一个数组中。然后去获取缓冲区中的数据,同时绘制矩形。当前的代码不会使用书中的缩写,每一步都是会展开写。希望能给后来学习的一些帮助。我会持续更新关于wegl的编程指南中的代码。在绘制的时候我们给它添加上颜色。接着做使用缓冲区赋值。

huhudeni的博客 277

WEBGL Shader零基础教程(十八):基础图形与颜色效果之绘制基本图形

本文介绍了使用WebGL Shader绘制基本图形的核心原理与实践方法。首先讲解了WebGL渲染流程,强调像素级计算与抗锯齿处理的重要性。随后通过5个实战案例(矩形、圆形、三角形、圆角矩形、正多边形)详细演示了不同图形的绘制逻辑,包括坐标转换、边界判断和交互实现。文中还提供了常见问题排查指南,如变形、锯齿和延迟问题,并给出优化技巧以提升性能与视觉效果。最后,文章总结了核心知识点,并建议了进一步学习方向,包括图形动画、纹理映射和复杂UI组合等进阶内容。

分享知识,拥抱变化 920

canvas画四边形,移动顶点可以改变形状

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X...

q290057637的博客 4157

WebGL概述

WebGL标准是由科纳斯组织(Khronos Group)开发和维护,该组织还管理着OpenGL、COLLADA等。WebGL的官方描述:WebGL是免授权费的,跨平台的应用程序接口API。它将OpenGL ES 2.0作为在HTML网页内的3D绘图环境,作为低级别文档对象模型接口开放。它使用OpenGL渲染语言GLSL ES,并可整洁地与其他3D内容上层或下层的网页内容捆绑。它是使用JavaScript编程开发语法开发,适合动态3D网页应用的理想工具,并已被主流互联网浏览器集成。

qq_34754747的博客 1238

Flexible H-Tree(灵活 H 树)与 Multi-Tap 时钟流程解析

通过灵活 H 树与多抽头技术的结合,复杂时钟架构可在保持电气对称性的同时适应不规则布局,为高性能、低功耗 SoC 设计提供高效的时钟网络解决方案。

weixin_45371279的博客 1914

css画平行四边形,六边形

这几天在做全流程看板,改了三个版本,这个第三个的原型图。没想到是多边形,并且要带边框的,只能重画了。

nss33678的博客 1153

SpringBoot 指标监控——Actuator

1、 访问:localhost:8000/actuator 设置健康监控显示具体情况 metrics http://localhost:8000/actuator/metrics/jvm.gc.live.data.size 定制化health信息 //利用构造器,在注册中心中添加cityService.saveCity.count指标 public CityServiceImpl(MeterRegistry meter...

weixin_44302046的博客 4628

canvas绘制不规则四边形

canvas绘制不规则四边形 话不多说,先给大家看看效果图 具体效果如下 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191219222706640.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L...

LavaStrom 2358

避坑指南:Spring3集成OpenAPI时泛型响应失效的3种解决方案

本文深入探讨了Spring3集成OpenAPI时泛型响应失效的问题,提供了三种实用解决方案:移除@Schema注解、使用@ArraySchema包装泛型以及自定义Schema处理器。针对不同项目规模,详细分析了各方案的适用场景、优缺点及性能影响,帮助开发者高效生成准确的接口文档,提升前后端协作效率。

weixin_30839881的博客 100

医学影像AI的幻觉问题与CCD解决方案

医学影像AI在辅助诊断中面临的核心挑战是幻觉现象,即模型生成不符合实际影像的虚假诊断。这种现象源于多模态大语言模型(MLLMs)在视觉-语言对齐上的技术局限,可能导致假阳性或假阴性的临床风险。通过临床对比解码(CCD)框架,结合症状锚定和专家引导的双阶段校准机制,可有效提升模型输出的可靠性。该技术在CheXpert和MIMIC-CXR等标准数据集上验证,显著改善了肺不张、胸腔积液等关键指标的检测准确率。对于医疗AI落地场景,这种即插即用的解决方案既规避了数据隐私合规问题,又降低了基层医院的部署门槛,为AI辅

weixin_36303807的博客 322

Unity移动端、WebGL 四边形线框Shader 实现

本文不是使用GeometryShader! 移动端和WebGL由于一些限制不能使用GeometryShader,因此不好实现线框Shader。 一、手动绘制 有的人可能会选择用GL画线来实现绘制线框,具体就是读取mesh信息然后绘制线条,但是GL绘制不能调整线条粗细。有的人可能有回使用LineRender或者直接用圆柱体。这样确实可以调整粗细,但是性能堪忧。。。 手动绘制,基本大一点的Mesh就会严重影响性能,不是很可取。 二、通过Mesh传参数 线框用shader实现的难度,就是很难找到三角的

BDDNH的博客 3123

[Dify] -进阶13- 使用“知识库 + 工作流”打造智能推荐系统

本文介绍了在Dify平台上构建智能推荐系统的方法,重点阐述了知识库与工作流技术的结合应用。通过知识库管理RAG流程,实现文档上传、向量嵌入和检索优化;利用工作流设计节点化推荐逻辑,支持并行处理与条件分支。以电话销售话术推荐为例,展示了从数据收集到实时生成的完整流程。该方法具有准确性高、扩展性强、维护简便等优势,可广泛应用于各类推荐场景,实现从数据存储到智能推荐的闭环解决方案。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1067

WebGL立方体的绘制

webGL坐标系统,x沿水平方向从左到右,y垂直向上,z指向屏幕向外这些都是正方向 canvas坐标系统,z,x一样,但是y是向下的。 浏览器坐标系,x,是向左、y是向下的。 tip: 鼠标点击的是浏览器的坐标系统,要先转换为Canvas的坐标系统,也就是0点是不一致的。然后就是webGL的坐标要进行归一化。同时把原点切换到Canvas的中心。网格:就是有一个或多个多边形拼接而成的,网格只能确定形状不能确定色彩和明暗等 多边形:多指三角形和四边形 模型:也就是3D的网格的别名 顶点:就是定义多边形位置的3D

gghhb12的博客 1693

装上大模型翅膀,程序员入职新公司如何快速上手代码(老员工如何选择大模型编程如虎添翼)

入职新公司,尤其是行业知识不懂的,面对前人堆积的屎山代码,各种文档又缺少的,有些技术自己又不懂的,如何快速上手代码,特别是借助AI大模型事半功倍的上手项目代码。进入新公司,我做的第一件事就是收集情报。我主动向同事们索要项目的相关资料,包括项目介绍文档、功能说明文档和业务流程图等。通过仔细阅读这些资料,可以对项目的背景和架构有了初步的了解。同时要逮住机会就向同事们请教项目的迭代历程和技术选型背后的考量。有时他们三言二语,可以为自己节省很多探索时间。在了解了项目的基本情况后,可以开始深入探究项目的业务流程。

大模型大数据攻城狮的专栏 1129

开源模型应用落地-qwen模型小试-入门篇(二)

在windows环境下,使用transformer设置模型参数/System Prompt/历史对话

以微薄之力,予他人些许温暖. 3234

WebGL绘制四边形

画两个三角形拼成一个四边形

bb_111的博客 252

Lammps不同亲疏水性粗糙表面的润湿行为模拟(包含in文件)

Lammps粗糙表面的润湿行为模拟(包含in文件)前言—润湿行为模拟一、物理模型构建二、具体in文件—in文件内循环亲疏水性三、具体in文件—分子模板构建初始模型以及平衡态模拟四、全部代码(基地粗糙表面只提供data文件) 前言—润湿行为模拟 润湿现象:当液体与固体接触时,液体的附着层将沿固体表面延伸。当接触角 θ\rm \thetaθ 为锐角时,液体润湿固体,若θ为零时,液体将展延到全部固体表面上。润湿现象的产生与液体和固体的性质有关。(来自百度百科) 润湿行为的本质是固液之间的相互作用,也就是分子间的范

Rockyoung 7090

WebGL编程指南案例解析之绘制四边形

//案例4,绘制矩形,和三角形类似,但是注意因为一个矩形有4个顶点,按照两个三角形绘制矩形的话,顶点顺序要注意 var vShader = ` attribute vec4 a_Position; void main(){ gl_Position = a_Position; } `; var fShader = ` void main(){ ...

weixin_30485799的博客 284

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WebGL教程1:一个三边形和一个四边形

欢迎来到我的第一个WebGL教程!这节教程是以NeHe的OpenGL教程第二课为基础的(译者注:这里有网上找到的NeHe的OpenGL中文教程),NeHe的OpenGL教程是学习3D图形游戏编程很流行的一个教程。这节课向你解释怎样在页面上绘制一个三边形和一个四边形。也许这本身不是那么令人兴奋,但这是对WebGL基础的一个很好的介绍:如果你知道它是这样工作,剩下的会是十分相似……这儿是这节课的代码在...

wjlgryx的专栏 534

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

4、webgl 基本概念 + 绘制四边形

摘要:文章介绍了WebGL中两种缓冲区类型(ARRAY_BUFFER和ELEMENT_ARRAY_BUFFER)的区别,以及绘制图元的相关方法。ARRAY_BUFFER需要写入所有顶点数据,而ELEMENT_ARRAY_BUFFER通过索引优化可减少重复顶点。文中详细讲解了gl.drawElements()参数和使用场景,并提供了绘制四边形的基础代码示例和优化版本。特别强调矩形绘制时顶点顺序的重要性(正面逆时针、背面顺时针),以及如何通过索引缓冲区提升性能。最后给出了完整的HTML实现代码。

所学所思 757

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WebGL绘制一个矩形

WebGL绘制一个矩形 本文是WebGL电子书的2.2节内容 学习建议 学习本节课,建议先结合注释看看案例源码,对于不熟悉的WebGL API可以在MDN搜索文档,不过刚开始学习,没必要去掌握每一个WebGL API,把主要精力放在理解WebGL的整个渲染流程上面,如果你能建立渲染管线的概念,自然对WebGL系统会有一个基本的认知。 源码体验测试 //类型数组构造函数Float32Array创建顶...

u014291990的博客 1773

LearingWebGL Lesson one WebGL教程

欢迎来到我的第一个WebGL教程!这节教程是以NeHe的OpenGL教程第二课为基础的(译者注:这里有网上找到的NeHe的OpenGL中文教程),NeHe的OpenGL教程是学习3D图形游戏编程很流行的一个教程。这节课向你解释怎样在页面上绘制一个三边形和一个四边形。也许这本身不是那么令人兴奋,但这是对WebGL基础的一个很好的介绍:如果你知道它是这样工作,剩下的会是十分相似……这儿是这节课的代码在支持WebGL的浏览器运行看起来的效果:一个小的忠告:这些教程所针对的人群是具有一定的编程知识,但是没有真正的3

WebGL专栏 2116

webgl 绘制太阳 地球 月亮

目录1、开发环境2、内容说明1、计算球体的坐标和纹理2、求顶点索引3、数据加载到缓存中4、绘制球体5、其他3、运行结果及代码下载 1、开发环境 浏览器:谷歌 编程语言:webgl 编程软件:webstorm 2、内容说明 模拟太阳 、地球、月亮运动;有光照和纹理 1、计算球体的坐标和纹理 球体坐标值的计算公式 x = rcos(θ) cos(φ) y = rcos(θ) sin(φ)...

热带宇林 1444

WebGL学习系列-多边形绘制原理

前言 前面学习了通过缓冲区对象来绘制多个点的原理,在实际的3D世界里,有好多复杂的模型,但细化分解后又是由一个个基础的几何图形构成的,掌握了基础图形的绘制才能够理解更加复杂的模型。本节将会讲解三角形,矩形以及利用三角函数绘制圆。 WebGL几何图形绘制 之前的篇章我们通过 drawArrays 这个api绘制过单个点以及多个点,然而,它的功能不仅仅如此,它也是绘制多边形的基石。先来看下面这张熟悉...

android开发笔记 575

WebGL 从0到1绘制一个立方体

我们来绘制如下图所示的立方体(图右侧显示了立方体每个顶点的坐标),其8个顶点的颜色分别为白色、品红色(亮紫色)、红色、黄色、绿色、青色(蓝绿色)、蓝色、黑色。你也许知道,为每个顶点定义颜色后,表面上的颜色会根据顶点颜色内插出来,形成一种光滑的渐变效果(“色体”,相当于二维的“色轮”)。绘制三角形,我们都是调用gl.drawArrays()方法来进行绘制操作的。考虑一下,如何用该函数绘制出一个立方体呢。我们只能使用gl.TRIANGLES、gl.TRIANGLE_STRIP或者gl.TRIANGLE_FAN模

求上得中,求中得下 1057
上一篇: webgl(一):开发环境配置
下一篇: webgl绘制客厅房间的家具+座椅板凳床
热带宇林V
博客等级 码龄13年 106粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值