当前位置: 首页 > news >正文

学习WebGl基础知识(二)

学习目标:

  • 掌握WebGl基础知识

学习内容:

创建一个Webgl程序

  1. 创建三维上下文对象
  2. 创建顶点着色器和片元着色器
  3. 创建和编译顶点着色器和片元着色器
  4. 创建着色器程序对象
  5. 绘制图元

创建一个Webgl程序

1.第一步获取画布,创建三维上下文对象

<canvas class="canvas" width="500" height="500"></canvas><script>const canvas = document.querySelector('.canvas')const gl = canvas.getContext('webgl')
</script>

2.第二步创建顶点着色器和片元着色器

顶点着色器和片元着色器(两种方法,一种就是下面这样在script标签内通过type属性创建,第二种就是通过js的模版字符串创建)
方法一:

<!-- 顶点着色器 --><script id="vertex-shader" type="x-shader/x-vertex">attribute vec2 aPos;attribute vec2 aPos1;void main(){gl_PointSize = 10.0;vec2 newPos = aPos + aPos1;gl_Position = vec4(newPos, 0.0, 1.0);}</script><!-- 片元着色器 --><script id="fragment-shader" type="x-shader/x-fragment">void main(){gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}</script><script>
// 获取着色器源码const vertexSource = document.getElementById('vertex-shader').innerTextconst fragmentSource = document.getElementById('fragment-shader').innerText
</script>

方法二:

<script>
// 定义顶点着色器
const vertexShaderSource = `attribute vec2 position;void main(){gl_Position = vec4(position, 0.0, 1.0);}
`
// 定义片元着色器
const fragmentShaderSource = `void main(){gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}
`
</script>
  • attribute vec2 position;:声明了一个名为 position 的顶点属性,它是一个二维向量。
  • void main(){…}:顶点着色器的主函数,计算每个顶点的最终位置。
  • gl_Position = vec4(position, 0.0,1.0);:将顶点属性 position赋值给gl_Position,这是一个四维向量,表示顶点的最终位置。vec4(position, 0.0, 1.0)表示在二维空间中,顶点的z值为0.0,w值为1.0。
  • gl_FragColor = vec4(1.0,0.0,00,1.0);:将片元的颜色设置为红色,使用 vec4表示颜色,RGBA 分别为(1.0,0.0, 0.0, 1.0)。

3.第三步创建和编译顶点着色器和片元着色器

// 创建顶点着色器对象和片元着色器对象
const vertexShader = gl.createShader(gl.VERTEX_SHADER)
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)
// 绑定着色器源码到对应着色器对象上
gl.shaderSource(vertexShader, vertexSource)
gl.shaderSource(fragmentShader, fragmentSource)
// 编译着色器源码
gl.compileShader(vertexShader)
gl.compileShader(fragmentShader)
  • gl.createShader(gl.VERTEX_SHADER);:创建一个顶点着色器对象。
  • gl.shaderSource(vertexShader, vertexShaderSource);:将顶点着色器源码绑定到顶点着色器对象。
  • gl.compileShader(vertexShader);:编译顶点着色器。

4.第四步创建着色器程序对象

// 创建程序对象
const program = gl.createProgram()
gl.attachShader(program, vertexShader)
gl.attachShader(program, fragmentShader)
gl.linkProgram(program);
gl.useProgram(program);
  • gl.createProgram();:创建一个着色器程序对象。
  • gl.attachShader(program, vertexShader);:将顶点着色器附加到着色器程序对象。
  • gl.attachShader(program, fragmentShader);:将片元着色器附加到着色器程序对象。
  • gl.linkProgram(program);:链接着色器程序对象,将顶点着色器和片元着色器链接成一个完整的可执行程序。
  • gl.useProgram(program);:告诉 WebGL使用这个着色器程序对象作为当前的渲染程序。

5.第五步绘制图元

// 绘制图元
gl.drawArrays(gl.POINTS, 0, 1)
  • gl.drawArrays(gl.POINTS, 0, 1);:从当前绑定的缓冲区中提取数据,根据指定的绘制模式进行绘制
  • gl.POINTS:指定绘制图元类型为一个点
  • 0:从顶点数组的第一个点开始绘制
  • 1:绘制一个点

运行结果
请添加图片描述

完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>第一个WebGL程序</title><style>canvas{border: 1px solid #ccc}</style>
</head>
<body><canvas class="canvas" width="500" height="500"></canvas><!-- 顶点着色器 --><script id="vertex-shader" type="x-shader/x-vertex">void main(){gl_PointSize = 10.0;gl_Position = vec4(0.5, 0.0, 0.0, 1.0);}</script><!-- 片段着色器 --><script id="fragment-shader" type="x-shader/x-fragment">void main(){gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}</script><script>const canvas = document.querySelector('.canvas')const gl = canvas.getContext('webgl')// 创建顶点着色器和片元着色器const vertexShader = gl.createShader(gl.VERTEX_SHADER)const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)// 获取着色器源码const vertexSource = document.getElementById('vertex-shader').innerTextconst fragmentSource = document.getElementById('fragment-shader').innerText// 绑定着色器源码gl.shaderSource(vertexShader, vertexSource)gl.shaderSource(fragmentShader, fragmentSource)// 编译着色器源码gl.compileShader(vertexShader)gl.compileShader(fragmentShader)// 创建程序对象const program = gl.createProgram()gl.attachShader(program, vertexShader)gl.attachShader(program, fragmentShader)gl.linkProgram(program);gl.useProgram(program);// 绘制图元gl.drawArrays(gl.POINTS, 0, 1)</script>
</body>
</html>

总结

本篇文章讲解了如何通过WebGL绘制一个最基础的点,后续文章会持续更新。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Docker原理及实例
  • 使用docker部署project-exam-system(项目)
  • QT connect的使用
  • SLM2110CG 1.0A/1.6A600V完美代替IR2110 精准驱动,可靠之芯 高压、高速的功率MOSFET和IGBT驱动器
  • 【深度解读】知识库的作用
  • NVIDIA GeForce RTX标志升级 加入AI的力量
  • 9、Django Admin优化查询
  • MacOS下WKWebView设置背景透明问题
  • 行业内幕曝光!全域运营公司究竟哪家好?
  • 【mac】MAC命令快速模糊查找文件
  • MySQL的事务认识
  • 国产游戏技术:迈向全球引领者的征途
  • 构建高效搜索系统 - Faiss向量数据库的快速入门
  • windows C++ 并行编程-并发的异常处理(三)
  • 关于一个早期的计算机网络的理解
  • 03Go 类型总结
  • C语言笔记(第一章:C语言编程)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • es的写入过程
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • pdf文件如何在线转换为jpg图片
  • python 装饰器(一)
  • React-flux杂记
  • Vue2.x学习三:事件处理生命周期钩子
  • windows-nginx-https-本地配置
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 记一次和乔布斯合作最难忘的经历
  • 聚类分析——Kmeans
  • 力扣(LeetCode)965
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何合理的规划jvm性能调优
  • 如何实现 font-size 的响应式
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 思维导图—你不知道的JavaScript中卷
  • 新版博客前端前瞻
  • 学习Vue.js的五个小例子
  • 《码出高效》学习笔记与书中错误记录
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #includecmath
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (6)设计一个TimeMap
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十六)一篇文章学会Java的常用API
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *p++,*(p++),*++p,(*p)++区别?
  • .jks文件(JAVA KeyStore)