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

webgl (原生)基础入门指南【一】

来看这篇文章的同学一定是被近来的3D场景效果所震撼,抱着‘这TM怎么做的!’的来心态来学习webgl的吧。
也行你已经有threejs或其他3d场景开发框架的使用经验,却不知道webgl原生到底怎么写。本系列将从最简单最基础的原生API入手,手把手教你写webgl

准备webgl上下文

同二维场景一样,我们需要一个画布来绘制,在html中建立一个 canvas 元素。代码如下:

// index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <!--  Meta  -->
  <meta charset="UTF-8" />
  <title>Webgl  Hello world!</title>
</head>
<body onload="start()">
  <canvas id='main' width=500 height=400></canvas>
  <script src="./index.js"></script>
</body>
</html>

start() 函数将会在文档加载完成之后被调用。它的任务是设置 WebGL 上下文并开始渲染内容。

// index.js
function start() {
  var canvas = document.getElementById("main");
  // 初始化 WebGL 上下文
  var gl = initWebGL(canvas);
  // 开始渲染
  ......
}
function initWebGL(canvas) {
  // 创建全局变量
  var gl = null;
  
  try {
    // 尝试获取标准上下文,如果失败,回退到试验性上下文
    gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
  }
  catch(e) {}
  
  // 如果没有GL上下文,马上放弃
  if (!gl) {
    alert("WebGL初始化失败,可能是因为您的浏览器不支持。");
    gl = null;
  }
  return gl;
}

getContext('context 参数') 返回参数支持的上下文,如果参数无效,则返回 null 。我们在画二维canvas的时候才用的是.getContext('2d'),返回 CanvasRenderingContext2D 对象 ;三维却并不是想当然的'3d'而是canvas.getContext("webgl") 或者 canvas.getContext("experimental-webgl"),返回一个WebGLRenderingContext 对象。不同的浏览器内核支持的参数不同,具体如下:
clipboard.png

清屏clearColor

画过canvas的亲应该都会使用一个颜色填充来清理帧画面。webgl同意需要这样一个清理函数在绘制下一画面的时候。webgl才用rgba的四色系统来定义颜色。与我们平时所用的颜色系统不一样的是,RGBA四个分量使用0.0~0.1之间的数值来表示。前三个分量表示三原色的饱和度,最后一个表示不透明度。

值得一提的是,webgl计算都是才用浮点计算,所以数值一般1写为1.0,数值 0 写为 0.0

这里我们需要进行四个初始化步骤

  1. 设置清除颜色(蓝色,不透明)

    gl.clearColor(0.0, 1.0, 1.0, 1.0);

  2. 深度清理

    gl.clearDepth(1.0);

  3. 开启“深度测试”, Z-缓存

    gl.enable(gl.DEPTH_TEST);

  4. 设置深度测试,近的物体遮挡远的物体

    gl.depthFunc(gl.LEQUAL);

清理画布的时候调用 gl.clear(gl.COLOR_BUFFER_BIT);来清理画布。
这样我们便准好了一个webgl的画布可以开始绘图了。
demo地址:http://codepen.io/leanneCC/pe...

相关文章:

  • 关于“服务器提交了协议冲突. Section=ResponseStatusLine问题
  • SAP S4系统创建Customer和Vendor的BAPI
  • 09_platform-tools简介常见adb指令
  • Android网络开发之HttpURLConnection
  • nfs客户端进程变D,延伸linux的lock
  • 9 外观模式(Facade)
  • 线程的同步与死锁
  • 用TinySpider进行网页抓取实例
  • UI图像拖动更换
  • Mysql避免全表扫描sql查询优化 .
  • LR杂记 - 性能測试指标及经常使用的监控工具
  • linux常见问题汇总
  • jps命令
  • 招投标流程
  • 从零开始教你制作友善之壁TINY4412----SD卡uboot启动卡
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • JavaScript新鲜事·第5期
  • Java编程基础24——递归练习
  • Map集合、散列表、红黑树介绍
  • Mithril.js 入门介绍
  • Rancher-k8s加速安装文档
  • STAR法则
  • vue--为什么data属性必须是一个函数
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 高性能JavaScript阅读简记(三)
  • 机器学习中为什么要做归一化normalization
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 目录与文件属性:编写ls
  • 排序算法之--选择排序
  • 盘点那些不知名却常用的 Git 操作
  • 如何编写一个可升级的智能合约
  • 使用API自动生成工具优化前端工作流
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • Hibernate主键生成策略及选择
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #define
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)SpringCloud 整合Python
  • (done) 两个矩阵 “相似” 是什么意思?
  • (多级缓存)多级缓存
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)学习JVM —— 垃圾回收机制
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (七)理解angular中的module和injector,即依赖注入
  • (十)c52学习之旅-定时器实验
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Scala的“=”符号简介
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net core 源码_ASP.NET Core之Identity源码学习