WebGL 101

webGL入门知识讲解 webgl入门知识讲解 阅读详情
  • 简介

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

WebGL是什么?WebGL是一项利用JavaScript API呈现3D计算机图形的技术,有别于过往需加装浏览器插件,通过WebGL的技术,只需要编写网页代码即可实现3D图像的展示。

在详细了解WebGL之前,先看看WebGL为我们带来的3D视觉震撼吧。

  1. Lights  在 Lights 中,黄色的“闪光线”会随着鼠标的左右点击而左右摆动,当“气泡”出现时,点击它们会出现焰火般的炫丽景象。而其背景音乐是英国歌手 Ellie Goulding 制作的一个互动音乐体验,同时随着音乐节拍界面会有呼吸状的闪光。
  2. 经典鱼缸测试这是一个经典的网页速度测试,电脑网速越快,鱼游的速度就越快,另外有多个场景可以切换,鱼的数量也可以设置。
  3. WebGL Water展示了使用WebGL模拟水的效果,可以通过操作水中的球体来感受水体的变化。

要看到上面这些绚烂的效果,你需要确保你的浏览器支持WebGL,目前支持WebGL的浏览器众多,包括:

  • 开发环境搭建

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

开发WebGL的环境十分简单,你甚至只需要支持WebGL的浏览器和文本编辑器就可以了。通过我的简单测试,推荐使用Google的Chrome浏览器进行开发和调试。WebGL属于3D开发,因此有以下的编程基础可能对你熟练掌握WebGL大有裨益,包括:

  1. OpenGL的相关知识,WebGL是基于OpenGL ES 2.0作为技术蓝本的,而OpenGL ES 2.0又是以OpenGL 2.0为基础。

                                                                     Fig 1  OpenGL和WebGL
  2. Shader尤其是GLSL的编程经验。
    推荐的GLSL学习材料:
    • LightHouse GLSL Tutorial (国内局域网有时候可能访问不了,o(╯□╰)o)
    • OpenGL Shading Language(橙宝书,目前到第三版,网上很容易找到电子版)
    • racehorse的优快云 Blog(lighthouse3d的翻译版)
  3. JavaScript相关编程经验
  • Hello,WebGL

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在学习一门新的技术时,如果可以有一个完整的框架,不需要每次都从头开始,对初学者是非常有益的。本文以下部分提供一个完整的WebGL程序,并通过对该程序的解读让读者对如何使用WebGL开发有一个完整的认识。相关内容来自WebGL Programming Guide一书。

  1. 首先创建我们的WebGL第一个示例的Html文件,在任意文件夹中建立名为HelloWebGL.html的文件,用文本编辑器打开,键入以下Html
    <!DOCTYPE html>
    <HTML>
    <HEAD>
    <META NAME="GENERATOR" Content="Microsoft Visual Studio">
    <TITLE>Hello WebGL!</TITLE>
    </HEAD>
    <BODY onload="main()">
    
        <canvas id="webgl" width="400" height="400">
            Your Browser doesn't support WebGL
        </canvas>
       
        <script src="HelloWebGL.js"></script>
    
    </BODY>
    </HTML>
    
    可以看到WebGL绘图的区域是在浏览器中canvas标签之下进行的,canvas标签是Html5引入的一个新的标签,可以在canvas区域绘制2D和3D图形。为了代码的清晰,将WebGL代码的编写部分放在了HelloWebGL.js文件中,也可以将WebGL的代码放在Html中。
  2. 在同一文件夹中建立HelloWebGL.js的文件,开始在其中编写WebGL相关代码
    首先我们需要在代码中写一些GLSL的代码,关于GLSL的编写参看以上GLSL的推荐材料,一般来说GLSL分为两种类型,顶点Shader和片元Shader。在写好Shader之后需要将Shader进行如C语言一样的编译、链接、运行的过程。流程如下:

                                                Fig 2  Shader使用过程
    var VSHADER_SOURCE =
        'void main() {\n' +
        '   gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n' +
        '   gl_PointSize = 10.0;\n' +
        '}\n';
    var FSHADER_SOURCE =
        'void main() {\n' +
        '   gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' +
        '}\n';

    以上就是我们写好的Shader,十分的简单,设置顶点位置在(0.0, 0.0, 0.0)处,顶点的大小为10.0,顶点栅格化之后的像素颜色是红色(1.0,0.0,0.0)

    写好Shader之后我们开始写Html中提到加载需要的main函数,代码如下
    function main()
    {
        //获取画布
        var canvas = document.getElementById('webgl');
        //得到WebGL渲染的上下文
        var gl = canvas.getContext('experimental-webgl');
        if (!gl) {
            console.log("Failed to initialize WebGL Context");
            return;
        }
        //初始化Shader
        initializeShader(gl);
        //设置清除背景颜色(此处是黑色)
        gl.clearColor(0.0, 0.0, 0.0, 1.0);
        //清除背景
        gl.clear(gl.COLOR_BUFFER_BIT);
        //绘制点(GL_POINTS)
        gl.drawArrays(gl.POINTS, 0, 1);
    }

    在main函数中我们通过得到canvas的图形渲染上下文gl,之后所有的WebGL调用都是在gl上下文中进行的,main函数中调用的初始化shader的函数如下:
    function initializeShader(gl)
    {
        //创建一个顶点Shader
        var vertexShader = gl.createShader(gl.VERTEX_SHADER);
        if (!vertexShader) {
            console.log("Unable to create Vertex Shader");
            return;
        }
        //读入顶点Shader的内容
        gl.shaderSource(vertexShader, VSHADER_SOURCE);
        //编译顶点Shader
        gl.compileShader(vertexShader);
        var compiledVertexShader = gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS);
        if (!compiledVertexShader) {
            var error = gl.getShaderInfoLog(vertexShader);
            console.log('Failed to compile vertex shader: ' + error);
            gl.deleteShader(vertexShader);
            return;
        }
    
        //创建一个片元Shader
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        if (!fragShader) {
            console.log("Unable to create Fragment Shader");
            return;
        }
        //读入片元Shader的内容
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //编译片元Shader
        gl.compileShader(fragShader);
        var compiledFragmentShader = gl.getShaderParameter(fragShader, gl.COMPILE_STATUS);
        if (!compiledFragmentShader) {
            var error = gl.getShaderInfoLog(fragShader);
            console.log('Failed to compile fragment shader: ' + error);
            gl.deleteShader(fragShader);
            return;
        }
    
        //创建Program
        var program = gl.createProgram();
        if (!program) {
            return;
        }
        //将编译好的顶点Shader和片元Shader链接到Program之中
        gl.attachShader(program, vertexShader);
        gl.attachShader(program, fragShader);
        gl.linkProgram(program);
    
        var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
        if (!linked) {
            var error = gl.getProgramInfoLog(program);
            console.log('Failed to link program: ' + error);
            gl.deleteProgram(program);
            gl.deleteShader(fragShader);
            gl.deleteShader(vertexShader);
            return;
        }
        //使用(运行)Program
        gl.useProgram(program);
    }

    这一过程还是十分清晰的,流程就是参考了Fig2中的描述。以上就完成了所有的代码
  3. 用Chrome浏览器打开HelloWebGL.html,可以看到
    使用WebGL绘制的一个红色的像素点

    由于每一个WebGL的程序都需要initializeShader这一步骤,因此本文提供一个js文件,使用其中的initShaders函数,传入顶点和片元Shader字符实现shader的初始化过程。

    // cuon-utils.js (c) 2012 kanda and matsuda
    /**
     * Create a program object and make current
     * @param gl GL context
     * @param vshader a vertex shader program (string)
     * @param fshader a fragment shader program (string)
     * @return true, if the program object was created and successfully made current 
     */
    function initShaders(gl, vshader, fshader) {
      var program = createProgram(gl, vshader, fshader);
      if (!program) {
        console.log('Failed to create program');
        return false;
      }
    
      gl.useProgram(program);
      gl.program = program;
    
      return true;
    }
    
    /**
     * Create the linked program object
     * @param gl GL context
     * @param vshader a vertex shader program (string)
     * @param fshader a fragment shader program (string)
     * @return created program object, or null if the creation has failed
     */
    function createProgram(gl, vshader, fshader) {
      // Create shader object
      var vertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader);
      var fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader);
      if (!vertexShader || !fragmentShader) {
        return null;
      }
    
      // Create a program object
      var program = gl.createProgram();
      if (!program) {
        return null;
      }
    
      // Attach the shader objects
      gl.attachShader(program, vertexShader);
      gl.attachShader(program, fragmentShader);
    
      // Link the program object
      gl.linkProgram(program);
    
      // Check the result of linking
      var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
      if (!linked) {
        var error = gl.getProgramInfoLog(program);
        console.log('Failed to link program: ' + error);
        gl.deleteProgram(program);
        gl.deleteShader(fragmentShader);
        gl.deleteShader(vertexShader);
        return null;
      }
      return program;
    }
    
    /**
     * Create a shader object
     * @param gl GL context
     * @param type the type of the shader object to be created
     * @param source shader program (string)
     * @return created shader object, or null if the creation has failed.
     */
    function loadShader(gl, type, source) {
      // Create shader object
      var shader = gl.createShader(type);
      if (shader == null) {
        console.log('unable to create shader');
        return null;
      }
    
      // Set the shader program
      gl.shaderSource(shader, source);
    
      // Compile the shader
      gl.compileShader(shader);
    
      // Check the result of compilation
      var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
      if (!compiled) {
        var error = gl.getShaderInfoLog(shader);
        console.log('Failed to compile shader: ' + error);
        gl.deleteShader(shader);
        return null;
      }
    
      return shader;
    }
    
    /** 
     * Initialize and get the rendering for WebGL
     * @param canvas <cavnas> element
     * @param opt_debug flag to initialize the context for debugging
     * @return the rendering context for WebGL
     */
    function getWebGLContext(canvas, opt_debug) {
      // Get the rendering context for WebGL
      var gl = WebGLUtils.setupWebGL(canvas);
      if (!gl) return null;
    
      // if opt_debug is explicitly false, create the context for debugging
      if (arguments.length < 2 || opt_debug) {
        gl = WebGLDebugUtils.makeDebugContext(gl);
      }
    
      return gl;
    }
    




WebGL编程指南笔记-第二章 WebGL入门 阅读详情

相关推荐

某讯天御滑块验证码逆向实战:从参数解析到环境对抗

本文详细解析了某讯天御滑块验证码的逆向工程实战技巧,从关键参数解析到浏览器环境模拟对抗。重点介绍了collect、eks等参数的逆向思路,以及如何通过puppeteer等工具补全环境检测,帮助开发者有效突破验证码防护。文章还提供了常见错误解决方案和性能优化建议,是验证码逆向领域的实用指南。

weixin_29325007的博客 439

WebGL 基础概念

参考文章:https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-fundamentals.html#toc 着色器 WebGL 仅仅是一个光栅化引擎,它可以根据你的代码绘制出点,线和三角形。 WebGL 在电脑的 GPU 中运行。因此你需要使用能够在 GPU 上运行的代码。 这样的代码需要提供成对的方法。并且使用一种和C或C++类似的强类型的语言 GLSL。 (GL着色语言)。每一对组合起来称作一个 program(着色程序)。 两种着色器 每对

学习前端这门手艺,栈底到栈顶依次是:浏览器架构、Web 网络、事件循环机制、JavaScript 核心、V8 的内存管理、浏览器的渲染流程、Web 安全、CSS、React、Vue、Node、构建工具链等 942

WebGL系列教程:WebGL基础知识

使用顶点绘制的 2D 或 3D 模型称为网格,网格中的每个面都称为多边形,多边形由 3 个或更多顶点组成。要在 WebGL 渲染上下文中绘制模型,就必须使用 JavaScript 数组定义顶点和索引。例如,如果我们想创建一个位于坐标 {(5,5), (-5,5), (-5,-5)} 上的三角形,如下图。为了更好地理解指数,请考虑更复杂的模型,如 square,我们可以将正方形表示为一组两个三角形。

xiangzhihong8的专栏 1396

H5 浏览器WebGL性能分析工具类WebGLUtils

判定浏览器是否支持webgl,方法是创建一个带属性的webgl上下文,创建成功即支持。获取硬件信息,对设备进行定级和排名。综合判定是否可以展示3D shader动画。

ufrontend的博客 757

Cesium 实战 - 解决 The browser supports WebGL, but initialization failed 问题

在公司内网服务器部署 cesium 项目的时候,发现提示浏览器不支持 WebGL 错误,经尝试,确认 cesium 1.101.0 以及之前的版本是可以正常显示的。推测原因:由于 cesium 高版本 glsl 语法是 300 版本,但是 window 7 环境下支持的谷歌浏览器版本低,不支持 glsl 高版本语法。因此,是由于 cesium 版本更新引起的,而 cesium 在更新 1.102.0 的时候,webgl 将默认使用 2 版本。

非科班Java出身GISer的博客 6172

webgl-utils:webgl工具函数库,可用于处理图片

webgl-utils webgl 工具函数库,可用于处理图片 引入 import { Program } from "./jsUtil/program.js"; 创建 Program 对象 let pro = new Program("webgl"); Program(glid, gl); /** * @name:构造函数 * @param {*} glid:canvas元素的id * @param {*} gl:gl上下文,如果自己传入了gl上下文,则直接使用该gl,glid无效 * @return {ProgramObj} ProgramObj */ ProgramObj 属性 /** * @name: 执行此行代码会执行相应程序的绘制工作 * @param {*} * @return {*} * @LastEditors:

不止于笔记:用GAMES101里的图形学原理,手把手实现一个WebGL迷你渲染器

本文基于GAMES101课程中的计算机图形学原理,详细介绍了如何从零开始实现一个WebGL迷你渲染器。通过将理论转化为实践,包括投影矩阵实现、三角形光栅化、Z-Buffer优化等核心算法,帮助开发者深入理解图形学概念并应用于实际项目。文章还涵盖了Phong光照模型、阴影映射等高级技术,适合希望提升WebGL开发技能的读者。

weixin_33709364的博客 466

海康/大华设备如何接入GB28181平台?最新2022版互联避坑指南

本文详细解析了海康/大华设备接入GB28181平台的最新2022版互联避坑指南,涵盖参数配置、实时视音频点播协议交互及典型故障排查。重点介绍了GB/T28181-2022标准下的设备编码规范、SIP服务器配置及媒体流保活机制,帮助工程团队高效解决设备离线和媒体流中断等问题。

weixin_30733003的博客 687

不止于笔记:用Python/WebGL复现GAMES101核心算法(附代码)

本文通过Python和WebGL两种技术路径,详细复现了GAMES101课程中的六个核心计算机图形学算法,包括视图变换矩阵、透视投影、Z-Buffer算法等。每个算法模块均包含数学原理推导、代码实现解析和可视化验证,帮助读者深入理解计算机图形学的实践应用。

weixin_31458015的博客 425

如何优化Silvaco二极管仿真网格?这些参数设置技巧让你的结果更精确

本文详细介绍了如何优化Silvaco二极管仿真网格,通过精细调整网格参数提升仿真精度。重点解析了网格密度与计算精度的权衡、关键区域识别与网格强化策略,以及掺杂分布与网格适配技术,帮助工程师在半导体器件仿真中获得更准确的结果。

t8u9v0w1x的博客 660

STM32F4驱动海康工业相机实战:从PWM信号到精准触发拍照(附完整代码)

本文详细介绍了如何使用STM32F4开发板驱动海康工业相机,实现PWM信号精准触发拍照的完整方案。从硬件连接到PWM信号生成,再到相机触发配置与延迟补偿,提供了实战经验和完整代码,帮助开发者解决工业相机硬件触发中的关键问题。

weixin_33716941的博客 695

游戏开发-图形渲染相关学习路线

这个学习路线只是个人的心得,你不同意,那你就不同意吧。没啥好纠结的QaQ。

m0_58341019的博客 1458

自定义css属性实现渐变边框动画

自定义cs属性实现渐变边框动画

lemon的博客 1875

Intel扩展31.0.101.5445在实际项目中的应用案例

在早期版本中,我们发现当数据量增大时,页面会出现明显的卡顿现象,尤其是在移动设备上表现更差。在调研过程中,我发现Intel的这个扩展版本特别针对图形渲染和计算性能做了优化。而且这个版本还增强了对WebGL的支持,正好符合我们的项目需求。最近在开发一个需要高性能图形处理的Web应用时,我尝试使用了Intel扩展版本31.0.101.5445,发现它在性能优化方面确实有不少亮点。我们的解决方案是做了功能检测,在不支持的环境下自动回退到标准实现,确保所有用户都能正常使用。特别是在复杂场景下,卡顿现象明显减少。

BlackStone33的博客 804

Python实战:用pdfplumber从PDF中精准提取表格数据(附完整代码)

本文详细介绍了如何使用Python库pdfplumber从PDF中精准提取表格数据,包括环境配置、标准与复杂表格处理策略、数据清洗与验证等实战技巧。通过完整代码示例,帮助数据分析师和财务专业人士实现PDF数据提取的自动化,提升工作效率。

weixin_29061821的博客 400

基于STM32与HRTIM的四开关Buck-Boost双向DC-DC电源设计实战(附源码、仿真与设计解析)

本文详细介绍了基于STM32F334的HRTIM高分辨率定时器实现四开关Buck-Boost双向DC-DC电源的设计实战。通过精准的PWM控制、双环PID算法和智能模式切换逻辑,解决了电压震荡与效率优化等关键问题,并提供了完整的源码、PSIM仿真及参数计算,为高性能电源设计提供了实用参考。

7z8x2c4v6b9的博客 299

工业数据可视化:核心技术、应用场景与优化实践

数据可视化作为工业数字化转型的关键技术,通过图形化界面将传感器采集的原始数据转化为可操作信息。其核心原理在于多源数据融合与实时渲染,技术价值体现在提升生产异常响应速度、优化能源管理等方面。在智能制造场景中,数字孪生与SCADA系统的可视化应用尤为突出,如通过3D模型实时监控产线状态,或采用分级报警提升操作效率。典型实现路径包括工业MQTT协议构建数据总线、WebGL加速渲染等技术方案,其中移动端适配与AR叠加等创新应用正成为行业趋势。本文结合OEE提升、能耗优化等工业热词,深入解析可视化技术在设备监控、质量

weixin_34320159的博客 337

Vue3 - Arco Design Vue 表格组件 table 隐藏鼠标移入时 hover 高亮背景色,el-table 组件去除鼠标悬停在表格行的 hover 高亮效果(改变鼠标移入时的背景色)

vue3,arcodesignvue,arcodesign,表格,a-table,hover,表格hover的class类名是什么,class,hover,在arcodesignvue项目中,表格组件如何去掉鼠标移入时的hover效果,vue3arco.design表格组件修改鼠标移入行的背景颜色,table表格,取消表格行row移入高亮效果,去掉鼠标移入行时的hover效果,取消a-table的hover状态,取消高亮显示,隐藏表格鼠标hover效果,去除鼠标触摸变色效果,如何取消arco表

🏆 前端领域优质创作者 3773

Bambot软件控制教程:通过Web界面轻松操控你的AI机器人

Bambot是一个开源低成本AI机器人项目,让你能够轻松玩转开源机器人技术。本教程将详细介绍如何通过直观的Web界面控制Bambot机器人,无需复杂编程知识,新手也能快速上手。 ## Bambot支持的机器人模型 Bambot项目支持多种不同类型的机器人模型,满足不同场景的需求: [![Bambot双机械臂移动平台](https://raw.gitcode.com/gh_mirrors/ba

gitblog_00163的博客 1174

手把手教你学Simulink——基于Simulink的蚁群算法路径规划仿真建模示例

路径规划是机器人导航系统中的核心任务之一,旨在为机器人找到一条安全且高效的路径,使其能够从起点到达目标点,同时避免与障碍物发生碰撞。在开始之前,需要定义工作环境(例如地图),包括起点、终点以及可能存在的障碍物位置。通过本指南,我们介绍了如何基于Simulink结合MATLAB实现蚁群算法的路径规划仿真建模。

MHD0815的博客 223

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

GAMES101笔记 着色

着色、着色模型

qq_52133989的博客 964

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WebGL编程指南笔记-前言

WebGL编程指南学习笔记-前言

Kelvin’s blog 323

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

WebGL

效果较差:较于桌面开发API:Direct3D、OpenGL、UE、Unity。开发成本:熟悉并掌握一定的数据知识,例如:线性代数。硬件要求:开发及部署系统硬件要求较高,尤其GPU。

qq_34754747的博客 2601

有关于OpenGL、OpenGL ES、WebGL的小结

一.   OpenGL简介         OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图西象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

smsmn的专栏 9484

unity发布WebGL输入中文

P.S. 使用默认字体发布webgl后都不会显示,这里主要解决发布网页输入框输入不了中文问题。 发布WEBGL输入中文样例 提取码:ir2x

马摆摊 5224

WebGL入门指南

《WebGL入门指南》 基本信息 作者: (美)Tony Parisi 译者: 郝稼力 出版社:人民邮电出版社 ISBN:9787115316684 上架时间:2013-6-13 出版日期:2013 年6月 开本:16开 页码:186 版次:1-1 所属分类:计算机 更多关于 》》》《WebGL入门指南》 内容简介 计算机书籍   webgl是一项新的web 3d...

weixin_30376163的博客 158
上一篇: 用OpenSceneGraph实现的NeHe OpenGL教程 - 第十六课
下一篇: 用OpenSceneGraph实现的NeHe OpenGL教程 - 第十七课
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值