《WebGL编程指南》学习笔记——4.绘制一个点

《WebGL编程指南》学习笔记——4.绘制一个点

之前,我们学习了如何建立一个WebGL程序,如何使用一些简单的WebGL相关函数。这一节,我们进一步在一个示例程序中绘制一个最简单的图形:一个点。这一小节中我们要弄懂一个重要的概念:着色器。

下小节我们介绍坐标系统


我们进一步在一个示例程序中绘制一个最简单的图形:一个点。
此系列我编写的源码都可以在我的github下载到:https://github.com/hushhw/WebGL-Programming-Guide/tree/master/02HelloPoint1

HelloPoint1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Draw a point</title>
</head>
<body onload="main()">
    <canvas id="webgl" width="400" height="400">
        Please use the browser supporting "canvas".
    </canvas>

    <script src="../lib/webgl-utils.js"></script>
    <script src="../lib/webgl-debug.js"></script>
    <script src="../lib/cuon-utils.js"></script>
    <script src="HelloPoint1.js"></script>
</body>
</html>

在HelloCanvas.html文件中比较简单,需要注意的是需要引入一些其他的文件来支持webgl,文件下载可以到https://github.com/hushhw/WebGL-Programming-Guide/tree/master/lib自行下载。


着色器

WebGL依赖于一种新的称为着色器(shader)的绘图机制。着色器提供了灵活且强大的绘制二维或三维图形的方法,所有WebGL程序必须使用它。

HelloPoint1.js是这本书中使用着色器的第一个WebGL程序,在代码中,着色器程序是以字符串的形式“嵌入”在JavaScript文件中的,在程序真正开始运行前它已经设置好了。

WebGL需要两种着色器:

1. 顶点着色器( Vertex shader )

顶点着色器是用来描述顶点特性(如位置、颜色等)的程序。顶点(vertex)是指二维或三维空间中的一个点,如二维或三维图形的端点或交点。


2.片元着色器(Fragment shader)

片元着色器是进行逐片元处理过程如光照的程序。片元(fragment)是一个WebGL术语,你可以将其理解为像素(图像的单元)。


在后续,我们会详细的学习着色器。简单的说,在三维场景中,仅仅用线条和颜色把图形画出来是远远不够的。你必须考虑如光线照上去后,或者观察者的视角发生变化时,对场景会有什么影响。着色器可以高度灵活的完成这些工作;提供各种渲染效果。这也就是现在制作的三维场景如此逼真的原因。

这里写图片描述

图的左侧是两个浏览器窗口。它们是同一个窗口,上面一个是执行JS程序之前的窗口,下面一个执行之后的。
程序执行的流程大概是:

  • 运行JS程序,调用了WebGL的相关方法。
  • 顶点着色器和片元着色器会执行,在颜色缓冲区内进行绘制,这时就清空了绘图区。
  • 颜色缓冲区中的内容会自动在浏览器的 < canvas >上显示出来。

这里写图片描述

初始化着色器

“初始化着色器”我们调用辅助函数initShaders()对字符串形式的着色器进行了初始化。该函数被定义在lib文件夹下,前文提到下载方式了。
这里写图片描述
这里写图片描述

Web系统由两部分组成,即顶点着色器和片元着色器。在初始化着色器之前,顶点着色器和片元着色器都是空白的,我们需要将字符串形式的着色器代码从JavaScript传给WebGL系统,并建立着色器,这就是initShaders()函数要做的事情。着色器运行在WebGL系统中,而不是JavaScript程序中。

initShaders()函数执行成功后,着色器被创建好了并随时可以使用,顶点着色器将被首先执行,它对gl_Position变量和gl_PointSize变量进行赋值,并将它们传入片元着色器,然后片元着色器再执行。实际上,片元着色器接收到的是经过光栅化(将几何图形变为二维图像的过程)处理后的片元值;现在可以简单认为这两个变量从顶点着色器传入了片元着色器。

HelloPoint1.js

回到这个实例中来:示例程序的任务是,在屏幕上绘制一个10像素大小的点 ,它用到了两个着色器:

  • 顶点着色器指定了点的位置和尺寸。本例中:点的位置是(0.0,0.0,0.0),尺寸是10.0像素
  • 片元着色器指定了点的颜色。本例中,点的颜色是红色(1.0,0.0,0.0,1.0)。
/**
 * Created by hushhw on 17/12/12.
*/
//HelloPoint1.js
//顶点着色器程序
var VSHADER_SOURCE =
    'void main() {\n' +
    'gl_Position = vec4(0.5, 0.0, 0.0, 1.0);\n' + //设置坐标
    'gl_PointSize = 50.0;\n' + //设置尺寸
    '}\n';

//片元着色器程序
var FSHADER_SOURCE=
    'void main(){\n'+
    'gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n'+ //设置颜色
    '}\n';

function main() {
    var canvas = document.getElementById('webgl');

    var gl = getWebGLContext(canvas);
    if(!gl)
    {
        console.log('Failed to get the rendering context for WebGL');
        return ;
    }

    //初始化着色器
    if(!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)){
        console.log('Failed to initialize shaders.');
        return ;
    }

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

    gl.drawArrays(gl.POINTS, 0, 1);
}

这个文件包含三个部分:

  • 顶点着色器程序(GLSL ES 语言)
  • 片元着色器程序(GLSL ES 语言)
  • 主程序(JavaScript语言)

顶点着色器程序和片元着色器程序

这里写图片描述

着色器程序代码必须预先处理成单个字符串的形式,所以我们用+号将多行字符串连成一个长字符串。(每一行以\n结束,这是由于当着色器内部出错时,就能获取出错的行号,这对于检查源代码中的错误很有帮助;但是,\n并不是必须的。为了更容易维护,也可以把着色器代码写到单独的文件中(就像javaScript文件一样),然后通过javaScript程序从文件中读取出来加载。)

就像JS一样,着色器程序使用 = 操作符为变量赋值。首先将点的位置赋值给 gl_Position 变量,然后将点的尺寸赋值给 gl_PointSize 变量,这两个变量是内置在顶点着色器中,而且有特殊含义;gl_Position 表示顶点的位置,gl_PointSize 表示点的尺寸。

在看代码的时候你可能会有疑问,好像在定义顶点着色器时的类型和JS不一样。那是因为GLSL ES是一种强类型的编程语言,也就是说,开发者必须明确指出某个变量是某种“类型”的。
下面是这一节出现在GLSL ES代码中的几种类型:
这里写图片描述
注意:如果向某类型的变量赋一个不同类型的值。就会出错,例如,gl_PointSize 是浮点型的变量,你就必须向其赋浮点型的值。

在赋值给 gl_Position 时,我们添加了1.0作为第4个分量。由4个分量组成的矢量被称为齐次坐标。因为它能够提高处理三维数据的效率,所以在三维图形中被大量使用。虽然齐次坐标是四维的,但如果其最后一个分量是 1.0,那么这个齐次坐标就可以表示“前三个分量为坐标值”的那各个点。所以,当你需要用齐次坐标表示顶点坐标的时候,只要将最后一个分量赋为 1.0 就可以了。

主程序

这里写图片描述

main()函数的执行流程:
这里写图片描述

这个流程和上一节的区别就是增加了“初始化着色器”和“绘图”部分。

初始化着色器
//初始化着色器
    if(!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)){
        console.log('Failed to initialize shaders.');
        return ;
    }
绘制

首先我们清空绘制区域,然后我们使用 gl.drawArrays()来进行绘制。

gl.drawArrays(gl.POINTS, 0, 1);

gl.drawArrays()是一个强大的函数,它可以用来绘制各种图形:
这里写图片描述
示例函数调用该函数时,因为我么绘制的是单独的点,所以设置第1个参数为 gl.POINTS, 设置第2个参数为0,表示从第1个顶点(虽然只有1个顶点)开始画,第3个参数 count 为1,表示在这个简单的程序中仅绘制了1个点。

总结:

一旦顶点着色器执行完后,片元着色器就会开始执行,调用main()函数,将颜色值(红色)赋给gl_FragColor。最后,一个红色的10像素大小的点就被绘制在了(0.0,0.0,0.0,1.0)处,也就是绘制区域的中心位置。
这里写图片描述

文章内容借鉴于:
《WebGL编程指南》
http://www.cnblogs.com/mirror-pc/p/4181398.html
http://blog.csdn.net/weixin_40282619/article/details/78030629

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《WebGL编程指南》是一本介绍WebGL技术的经典书籍,它详细阐述了WebGL的原理、应用和实践,是WebGL开发必备的参考书。本书附带的源代码是学习和实践WebGL的重要材料,它涵盖了WebGL的各个方面,从基础的三维图形绘制到高级的光影渲染和复杂的交互效果。 源代码包含了多个示例程序,各个示例程序围绕着一个主题展开。例如,有些示例程序演示了如何绘制简单的三维图形,如立方体和球体,还有些示例程序演示了如何添加纹理和材质,以及如何实现跨浏览器的兼容性。 此外,本书中的源代码还包括了一些高级的示例程序,如阴影、反射和抗锯齿等。这些示例程序可以帮助读者深入理解WebGL的工作原理和实现方法,并在实践中掌握WebGL技术。 值得一提的是,本书的源代码是经过精心设计和优化的,它压缩和合并了多个文件,以提高程序的性能和加载速度。因此,读者在使用本书源代码时,需要按照书中指导的步骤进行安装和部署,以获得最佳的开发体验。 总之,本书的源代码是WebGL学习和实践的重要资源,它提供了丰富的示例程序和实战经验,帮助读者快速掌握WebGL技术,开发出优秀的WebGL应用程序。 ### 回答2: WebGL编程指南是一本关于WebGL技术的教材,涵盖了从基础知识到高级应用的内容。其中提供了多个实例,结合源代码,帮助读者快速掌握WebGL编程技巧。 这本书的源代码非常有用,通过它可以理解WebGL的原理,并且快速搭建自己的WebGL应用程序。源代码中详细说明了各个组件的作用和用法,还提供了多种渲染器、着色器和纹理的实现方法,这些都对于初学者来说非常有价值。 WebGL编程指南源代码重点涵盖了三个方面:顶点缓冲对象、着色器和纹理。在顶点缓冲对象方面,它提供了多种创建和操作缓冲对象的实现方法,包括创建缓冲区、填充缓冲区、更新缓冲区等。在着色器方面,源代码中提供了包括简单着色器、光照着色器、Phong着色器在内的多种实现方法,这些着色器实现了不同的效果,读者可以根据需要自行选择。 最后是纹理,源代码提供了多种纹理类的实现方法,支持2D纹理、CubeMap纹理,以及多种纹理过滤和纹理映射方式。 总之,WebGL编程指南源代码提供了非常有价值的WebGL编程实践经验,对于从事WebGL开发的人员,特别是初学者,这是一份非常有意义的参考资料。 ### 回答3: 《WebGL编程指南》的源码是一本非常有用的资源,可以帮助读者更深入地理解WebGL编程技术。这本书的源码包括了许多有趣、实用的示例,可以帮助读者学会如何使用WebGL进行3D图形编程。 在掌握了基本的WebGL编程知识后,读者可以通过学习这些示例来深入了解WebGL技术,例如如何使用各种着色器、如何创建和渲染各种3D对象、如何进行照明和纹理映射等等。 同时,《WebGL编程指南》的源码也很容易上手。每个示例都有详细的注释和说明,使得读者可以很容易地理解代码的实现细节。读者可以将这些例子作为起点,自行修改和扩展,创造出更加有趣、独特的WebGL应用。 总之,《WebGL编程指南》的源码是非常有价值的,可以帮助广大编程爱好者、WebGL初学者甚至是资深的WebGL开发者,掌握更加深入的WebGL编程技术,为他们创造出更加精彩、创新的WebGL应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值