WebGL 小白入门学习

news2024/12/25 17:56:48

1. WebGL是什么?

WebGL(Web Graphics Library)是一种JavaScript API,它允许你在不需要安装任何额外插件的情况下,直接在浏览器中渲染高性能的2D和3D图形。WebGL利用了用户的图形处理单元(GPU)来加快渲染速度,这意味着你可以在网页上创建类似桌面应用程序的视觉效果。

1.1 WebGL入门代码实现如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>给画布换个颜色</title>
</head>
<body>
    <canvas id="canvas" width="400" height="400">
        此浏览器不支持canvas
    </canvas>
    <script>
        const ctx = document.getElementById('canvas')
        const gl = ctx.getContext('webgl')
        gl.clearColor(1.0, 0.0, 0.0, 1.0)
        gl.clear(gl.COLOR_BUFFER_BIT)
    </script>
</body>
</html>

1.2 方法详解

(1)gl.clearColor(rg,b,a) 指定清空<canvas>的颜色,接收四个参数取值区间为 0.0~1.0)

(2)gl.clear(buffer) 清空canvas参数分为三项

  • gl.COLOR_BUFFER_BIT 清空颜色缓存
  • gl.DEPTH_BUFFER_BIT 清空深度缓冲区
  • gl.STENCIL_BUFFER_BIT 清空模板缓冲区

(3)gl.clear 需要和 gl.clearColor 提到的函数搭配使用

  • gl.clear(gl.COLOR_BUFFER_BIT) 和 gl.clearColor(0.0,0.0,0.0,1.0)
  • gl.clear(gl.DEPTH_BUFFER_BIT) 和 gl.clearDepth(1.0)
  • gl.clear(gl.STENCIL_BUFFER_BIT) 和 gl.clearStencil(0)

2. WebGL的基本组件

2.1 什么是着色器

(1)着色器:就是让开发者自己去编写一段程序,用来代替固定渲染管线,来处理图像的渲染。

  1. 顶点着色器:处理每个顶点的数据,如位置、颜色和纹理坐标。
  2. 片元着色器:处理每个像素(片元)的颜色和其他属性,最终决定屏幕上显示的颜色。
2.2 webgl 绘制一个点的流程

 2.2.1 创建着色器源码
// 顶点着色器源码
const vertexShaderSource = `
// 必须要存在 main 函数
void main() {
    // 要绘制的点的坐标
    gl_Position = vec4(0.0,0.0,0.0,1.0); // x, y, z, w齐次坐标(x/w,y/w, z/w)
    // 点的大小
    gl_PointSize = 10.0;
}`

// 片源着色器源码
const fragmentShaderSource = `
// 必须要存在 main 函数
void main() {
    gl_FragColor = vec4(0.0,0.0,0.0,1.0); // r, g, b, a
}`
2.2.2 创建着色器
// 创建顶点着色器对象
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
// 创建片段着色器对象
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
2.2.3 指定关联着色器源码
// 设置顶点着色器源代码
gl.shaderSource(vertexShader, vertexShaderSource);
// 设置片段着色器源代码
gl.shaderSource(fragmentShader, fragmentShaderSource);
2.2.4 编译着色器
// 编译顶点着色器
gl.compileShader(vertexShader);
// 编译片段着色器
gl.compileShader(fragmentShader);
2.2.5 创建程序对象
const program = gl.createProgram();
gl.attachShader(program,vertexShader)
gl.attachShader(program,fragmentShader)
gl.linkProgram(program)
gl.useProgram(program)
2.2.6 执行绘制
gl.drawArrays(gl.POINTS,0,1);    // 绘制一个点,需要1个点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 3d 鼠标设置的问题——隐藏/显示鼠标、锁定/解锁/限制鼠标、自定义鼠标形状

在unity开发的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;有时会发现鼠标不见了&#xff0c;有时发现鼠标在屏幕中心不能动&#xff0c;有时又想有图片自己定义一个鼠标形状。本文将对这些问题逐一进行探讨。 一、设置鼠标的可见性 使用语句&#xff1a; Cursor.vis…

网络初识基本概念总结

网络发展背景 经历了 单机阶段 -> 局域网阶段 -> 广域网阶段 -> 移动互联网阶段 (简单介绍一下) 其他一些小概念 局域网LAN: 是把一些设备通过交换机 / 路由器连接, 形成的私有网络广域网WAN: 是把更多的局域网相互连接起来,当规模足够大时形成广域网交换机和路由器…

Rhymes AI发布首款开源多模态AI模型Aria 性能超越GPT-4o mini等多家知名AI模型

最近&#xff0c;日本东京的初创公司 Rhymes AI 推出了他们的首款人工智能模型 ——Aria。该公司自称&#xff0c;Aria 是全球首个开源的多模态混合专家&#xff08;MoE&#xff09;模型。这个模型不仅具有处理多种输入模态的能力&#xff0c;还声称在能力上与一些知名的商业模…

大一高等数学速成指南

大一高等数学速成指南 高等数学作为大学理工科学生的基础课程&#xff0c;对于许多新生来说&#xff0c;既是挑战也是机遇。本文将为你提供一个高效的学习指南&#xff0c;帮助你快速掌握高等数学的核心内容。 1. 理解课程大纲 首先&#xff0c;你需要了解高等数学的课程大纲…

Linux(1. 基本操作_命令)

目录 关于超级用户root&#xff1a; root用户可以做什么&#xff1f; 避免灾难&#xff1a; 格式约定&#xff1a; 浏览硬盘&#xff1a; 命令行补全和通配符&#xff1a; 命令行补全&#xff1a; 通配符&#xff1a; 常用基本命令&#xff1a; 查看目录和文件&#xff…

使用SpringMVC搭建WEB项目时报错404的问题排查解决以及web.xml配置文件init-param行标红问题

一、使用SpringMVC搭建WEB项目时报错404的问题排查解决 很早前&#xff08;4年前&#xff09;就把这个搭建过&#xff0c;但今天运行的时候就是报404错误&#xff0c;见文章&#xff1a; JAVA开发中SpringMVC框架的使用及常见的404问题原因以及SpringMVC框架基于注解的开发实例…

Unity3d折叠Inspector中的变量

InspectorFoldoutGroup插件 [Pixeye.Unity.Foldout("【曲线图】")] public BrokenLineUpDownGraph aimStabilityGraph;[Pixeye.Unity.Foldout("【曲线图】")] public BrokenLineUpGraph aimDensityGraph;[Pixeye.Unity.Foldout("【曲线图】")] p…

libssh2编译部署详解

libssh2编译部署详解 一、准备工作二、编译libssh2方法一:使用Autotools构建方法二:使用CMake构建三、验证安装四、使用libssh2五、结论libssh2是一个用于实现SSH2协议的开源库,它支持建立安全的远程连接、传输文件等操作。本文将详细介绍如何在Linux系统下编译和部署libssh…

AI+视频监控:EasyCVR安防平台赋能火电制造行业的视频智能管理方案

随着信息技术的飞速发展和智能制造的深入推进&#xff0c;火电制造行业作为国民经济的重要组成部分&#xff0c;正面临着智能化转型的迫切需求。为了提升生产效率、保障设备安全、优化管理流程&#xff0c;火电制造企业迫切需要引入先进的视频监控与人工智能技术。EasyCVR安防监…

【Canvas与标牌】立入禁止标牌

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>立入禁止Draft1</title><style type"text/css"&g…

计算机网络(以Linux讲解)

计算机网络 网络协议初识协议分层OSI七层模型TCP/IP五层模型--初识 网络中的地址管理IP地址MAC地址 网络传输基本流程网络编程套接字预备知识网络字节序socket编程UDP socketTCP socket地址转换函数Jsoncpp 进程间关系与守护进程进程组会话控制终端作业控制守护进程 网络命令TC…

MES系列-工单管理

MES系列-工单管理 MES系列文章目录 ISA-95制造业中企业和控制系统的集成的国际标准-(1) ISA-95制造业中企业和控制系统的集成的国际标准-(2) ISA-95制造业中企业和控制系统的集成的国际标准-(3) ISA-95制造业中企业和控制系统的集成的国际标准-(4) ISA-95制造业中企业和控制系…

【STM32单片机_(HAL库)】6-1【串口通信UART、USART】通信基础

并行通信和串行通信 全双工、半双工、单工通信 单工通信&#xff1a;数据只能沿一个方向传输 半双工通信&#xff1a;数据可以沿两个方向传输&#xff0c;但需要分时进行 全双工通信&#xff1a;数据可以同时进行双向传输同步通信与异步通信 同步通信&#xff1a; 异步通信 …

『网络游戏』摄像机跟随【31】客

创建脚本文件夹 创建脚本 编写代码&#xff1a;CameraCtrl.cs using UnityEngine; public class CameraCtrl : MonoBehaviour{float dis;float height;float speed;Transform target;Vector3 targetPos;void Awake(){Screen.SetResolution(2304, 1296, FullScreenMode.Windowe…

24/10/12算法笔记 VGG

VGG特点&#xff1a; 1.深度&#xff1a;非常深 2.卷积核采用3*3&#xff0c;使得网络能够捕捉到更细粒度的图像特征 3.全连接层&#xff1a;使用全连接层来分类 4.使用ReLU激活函数&#xff0c;有助于缓解梯度消失 5.在卷积层和池化层后&#xff0c;使用局部归一化&#…

自动驾驶系列—自动驾驶整体开放平台:如何加速无人驾驶技术的落地?

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

AI金融攻防赛:金融场景凭证篡改检测(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何解决 金融场景凭证篡改检测的核心问题&#xff0c;以及解决思路和代码实现过程。希望…

vue3学习:数字时钟遇到的两个问题

在前端开发学习中&#xff0c;用JavaScript脚本写个数字时钟是很常见的案例&#xff0c;也没什么难度。今天有时间&#xff0c;于是就用Vue的方式来实现这个功能。原本以为是件非常容易的事&#xff0c;没想到却卡在两个问题上&#xff0c;一个问题通过别人的博文已经找到答案&…

JavaSE——集合4:LinkedList、ArrayList与LinkedList的选择

目录 一、LinkedList的全面说明 二、LinkedList的底层操作机制 (一)LinkedList添加结点源码 (二)LinkedList删除结点源码 三、LinkedList常用方法 四、ArrayList与LinkedList的选择 一、LinkedList的全面说明 LinkedList底层实现了双向链表和双端队列的特点可以添加任意…

设计模式之-策略模式配合枚举

1、定义枚举接收不同的参数使用不同的handler, 2、定义个handerl接口&#xff0c;统一方法处理&#xff0c;每个handler实现该接口 public interface IMethodHandler<T, R> {/*** 处理统一入口** param req*/R process(T req); } java3、定义一个简单工厂统一处理 Comp…