WebGL编程指南入门基础篇

本文深入讲解WebGL编程的基础知识,包括顶点着色器和片元着色器的作用,WebGL初始化流程,以及如何通过着色器编程实现图形的绘制和变换。探讨了齐次坐标、顶点和片元数据的传输,以及纹理映射的基本原理。

WebGL编程指南笔记-入门基础篇

着色器介绍

着色器分为顶点着色器片元着色器

  • 顶点着色器
    描述顶点特性,包括位置,颜色等
  • 片元着色器
    进行每个片元的处理过程,如光照等;在三维场景中,仅仅用线条和颜色把图形画出来是远远不够的

从js文件到浏览器渲染结果的处理流程示意图
2019-04-28-15-13-28

画点

  • 多基本缓冲区模型
    颜色缓冲区: gl.COLOR_BUFFER_BIT
    深度缓冲区: gl.DEPTH_BUFFER_BIT
    模板缓冲区: gl.STENCIL_BUFFER_BIT
  • 画点关键代码片段
// HelloPoint1.js (c) 2012 matsuda
// Vertex shader program
var VSHADER_SOURCE = 
  'void main() {\n' +
  '  gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n' + // Set the vertex coordinates of the point
  '  gl_PointSize = 10.0;\n' +                    // Set the point size
  '}\n';

  
// Fragment shader program
var FSHADER_SOURCE =
  'void main() {\n' +
  '  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' + // Set the point color
  '}\n';
  
// Initialize shaders
  if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
    console.log('Failed to intialize shaders.');
    return;
  }
  
// Draw a point
  gl.drawArrays(gl.POINTS, 0, 1);

webgl初始化流程

/**
 * 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;
}

2019-04-28-15-32-12

齐次坐标

homogeneous coordinate

2019-04-28-15-44-45

  • webgl的一个显著特征就是不需要交换颜色缓冲区

传输变量

  • Using Attribute Variables
    顶点相关的数据
    必须声明为全局变量
  • Using uniform variable
    顶点无关的数据

所有 attribute 变量都以 a_前缀开始; 所有 uniform 变量都以u_ 前缀开始

  • 获取着色器变量地址
var a_Position = gl.getAttribLocation(gl.program, 'a_Position'); 
  • 赋值
  gl.vertexAttrib1f(location, v0)   
  gl.vertexAttrib2f(location, v0, v1)   
  gl.vertexAttrib3f(location, v0, v1, v2)   
  gl.vertexAttrib4f(location, v0, v1, v2, v3) 

2019-04-28-16-22-10

  • 获取 uniform 变量地址
 gl.getUniformLocation(program, name)   
  • 赋值
  gl.uniform1f(location, v0)   
  gl.uniform2f(location, v0, v1)   
  gl.uniform3f(location, v0, v1, v2)   
  gl.uniform4f(location, v0, v1, v2, v3)   

绘制和变换三角形

使用缓冲区对象

  • 使用流程
    1.    创建缓冲区对象:Create a buffer object ( gl.createBuffer() ).   
    2.    将缓冲区对象绑定到目标:Bind the buffer object to a target ( gl.bindBuffer() ).   
    3.    向缓冲区对象中写入数据:Write data into the buffer object ( gl.bufferData() ).   
    4.    将缓冲区对象分配给a_Position变量:Assign the buffer object to an attribute variable ( gl.vertexAttribPointer() ).   
    5.    连接a_Position变量与分配给它的缓冲区对象:Enable assignment ( gl.enableVertexAttribArray() ).    

2019-04-28-17-10-54

webgl绘制基本图形

2019-04-28-17-35-26

2019-04-28-17-38-03

移动、旋转和缩放

  • 逐顶点操作(per-vertex operation)
  • 平移
    2019-04-28-18-10-23
  • 旋转
    2019-04-28-18-11-11
 x' = x cos β – y sin β  
 y' = x sin β + y cos β  
 z' = z     
  • 变换矩阵
    旋转举证
    2019-04-28-18-15-38

旋转平移矩阵
2019-04-28-18-17-26

高级变换与动画基础

矩阵操作函数库

2019-04-28-19-16-01

颜色与纹理

将非坐标数据传入顶点着色器

多种顶点数据信息存入顶点着色器

顶点着色器和片元着色器之间的数据传输

  • 图形装配过程/图元装配过程
  • 光栅化过程
  • varying变量

纹理映射

texture mapping

  • 准备好纹理图像
  • 配置映射方式
  • 加载纹理图像
  • 在片元着色器将纹理的颜色赋给片元
  • 纹理坐标

纹理映射过程主要包括五个部分

  • 顶点着色器中接收顶点的纹理坐标,光栅化后传递给片元着色器
  • 片元着色器根据片元的纹理坐标,从纹理图像中抽取出纹理颜色,赋给当前片元
  • 设置顶点的纹理坐标
  • 准备待加载的纹理图像,在浏览器中读取它
  • 监听纹理图像的加载事件,一旦加载完成,就在Webgl系统中使用纹理
基本信息 原书名:WebGL Programming Guide: Interactive 3D Graphics Programming with WebGL (OpenGL) 原出版社: Addison-Wesley Professional 作者: (美)Kouichi Matsuda Rodger Lea(松田浩一,罗杰.李) 译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121229428 上架时间:2014-6-11 出版日期:2014 年6月 开本:16开 页码:470 版次:1-1 ---------------------------------------- 目录 《WebGL编程指南》 第1 章 WebGL 概述 1 WebGL 的优势 3 使用文本编辑器开发三维应用 3 轻松发布三维图形程序 4 充分利用浏览器的功能 5 学习和使用WebGL 很简单 5 WebGL 的起源 5 WebGL 程序的结构 6 总结 7 第2 章 WebGL 入门 9 Canvas 是什么? 10 使用[canvas] 标签 11 DrawRectangle.js 13 最短的WebGL 程序:清空绘图区 16 HTML 文件(HelloCanvas.html) 16 JavaScript 程序(HelloCanvas.js) 17 用示例程序做实验 22 绘制一个点(版本1) 22 HelloPoint1.html 24 HelloPoint1.js 24 着色器是什么? 25 使用着色器的WebGL 程序的结构 27 初始化着色器 29 顶点着色器 31 片元着色器 33 绘制操作 34 WebGL 坐标系统 35 用示例程序做实验 37 绘制一个点(版本2) 38 使用attribute 变量 38 示例程序(HelloPoint2.js) 39 获取attribute 变量的存储位置 41 向attribute 变量赋值 42 gl.vertexAttrib3f() 的同族函数 44 用示例程序做实验 45 通过鼠标点击绘点 46 示例程序(ClickedPoints.js) 47 注册事件响应函数 48 响应鼠标点击事件 50 用示例程序做实验 53 改变点的颜色 55 示例程序(ColoredPoints.js) 56 uniform 变量 58 获取uniform 变量的存储地址 59 向uniform 变量赋值 60 gl.uniform4f() 的同族函数 61 总结 62 第3 章 绘制和变换三角形 63 绘制多个点 64 示例程序(MultiPoint.js) 66 使用缓冲区对象 69 创建缓冲区对象(gl.createBuffer()) 70 绑定缓冲区(gl.bindBuffer()) 71 向缓冲区对象中写入数据(gl.bufferData()) 72 类型化数组 74 将缓冲区对象分配给attribute 变量(gl.vertexAttribPointer()) 75 开启attribute 变量(gl.enableVertexAttribArray()) 77 gl.drawArrays() 的第2 个和第3 个参数 78 用示例程序做实验 79 Hello Triangle 80 示例程序(HelloTriangle.js) 80 基本图形 82 用示例程序做实验 83 Hello Rectangle(HelloQuad) 84 用示例程序做实验 85 移动、旋转和缩放 86 平移 87 示例程序(TranslatedTriangle.js) 88 旋转 91 示例程序(RotatedTriangle.js) 93 变换矩阵:旋转 97 变换矩阵:平移 100 4×4 的旋转矩阵 101 示例程序(RotatedTriangle_Matrix.js) 102 平移:相同的策略 105 变换矩阵:缩放 106 总结 108 第4 章 高级变换与动画基础 109 平移,然后旋转 109 矩阵变换库:cuon-matrix.js 110 示例程序(RotatedTriangle_Matrix4.js) 111 复合变换 113 示例程序(RotatedTranslatedTriangle.js) 115 用示例程序做实验 117 动画 118 动画基础 119 示例程序(RotatingTriangle.js) 119 反复调用绘制函数(tick()) 123 按照指定的旋转角度绘制三角形(dr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值