[WebGL入门]十九,遮挡剔除和深度測试
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外。鄙人webgl研究还不够深入,一些专业词语,假设翻译有误。欢迎大家指正。
多边形的外側,内側和遮挡剔除
上次介绍了索引缓存。以及使用IBO来画图,使用索引缓存能够循环利用反复的顶点,能够提高画图效率。这之后的文章,假设没有特殊的原因的话。基本上都会使用索引缓存,通过drawElements来画图。
这次来说一下遮挡剔除和深度測试,这是两个重要的概念。内容并非那么难。
首先来看遮挡剔除,假设看过之前的文章,应该知道[遮挡剔除]的概念,之前的文章(六。顶点和多边形)中有过说明。
简单的说,遮挡剔除就是以多边形内外側为基准,推断是否绘制这个多边形。
而多边形的内側和外側的推断方法。在之前的文章中已经具体说明了。为了加深印象,这里再说一遍。
WebGL中,默认规定遮挡剔除是无效的。不管以如何的顺序来定义顶点都会绘制所有的多边形。
可是,遮挡剔除有效的时候,仅仅有满足特定的条件的多边形才会进行绘制。看不见的部分是不会绘制的,这样就会减弱坐标计算等负担。
为了设置WebGL中的遮挡剔除为有效,须要像enable函数中传入适当的參数,这个enable函数不光是用来控制遮挡剔除的,还有其它非常多各种各样的參数,依据指定的參数不同会把对应的功能设置为有效。
将遮挡剔除设置为有效的话,须要传入内置常量gl.CULL_FACE ,以下是代码举例。
>将遮挡剔除设置为有效的代码演示样例
gl.enable(gl.CULL_FACE);
相反的,将对应的功能设置为无效的话,使用disable函数,传入的參数和enable函数相同。
>>遮挡剔除的内側和外側切换的方法 多边形的内側和外側是依据顶点的连接顺序来推断的,而这个推断基准反过来的情况也是有的,形成多边形的顶点的连接顺序是顺时针的时候是外側。逆时针的时候为内側。想要反过来推断的话。顺时针就变成了内側。 顺时针统称为CW。由于[顺时针]的英语是ClockWise。CW就是它的头文字。 而逆时针统称为CCW,由于[逆时针]的英语为CounterClockWise。改变WebGL中遮挡剔除的内側和外側的推断标准的函数是frontFace,參数就是刚才提到的CW和CCW。 将顺时针设置为[外側]的代码:gl.frontFace(gl.CW); 将顺时针设置为[内側]的代码:gl.frontFace(gl.CCW); |
深度測试
接着来说深度測试。
刚才提到的设置遮挡剔除的函数enable,也能够用来设置深度有效。将常量gl.DEPTH_TEST作为參数传给enable函数的话,就能够将深度測试设置为有效。相同的。使用disable函数能够将其设置为无效。
深度測试的默认值是无效的。那将深度測试设置为有效有什么用处呢,为什么要设置深度有效呢?
深度測试能够联想到[深度]这个词。三维空间中表示向里的方向时是不可缺少的一个元素。DirectX中叫做Z測试。要表示一个物体在你面前呢,还是向里一段距离呢,所以深度測试就是必须的了。
WebGL中发出画图命令的时候。是在一个模拟的三维空间中绘制模型的,这时候依据绘制的先后顺序,先绘制的东西会被后绘制的东西覆盖掉,这跟物体是在当前还是在里面是没关系的。
而实际上,在远处的物体应该被在近处的物体所覆盖。
将深度測试设置为有效的话。就是对模型的深度进行评价。评价合格的东西会绘制到画面上。不合格的东西就不会进行绘制了。
和刚才的遮挡剔除一样,将深度測试设置为有效或无效使用的是enable函数和disable函数。
>将深度測试设置为有效的代码演示样例
gl.enable(gl.DEPTH_TEST);
深度測试的评价函数为depthFunc,这个函数须要指定參数,通常是使用以下的常量作为參数。
>指定一般深度測试的评价方法
gl.depthFunc(gl.LEQUAL);
这里指定了内置常量gl.LEQUAL的话。就会把里側的东西隐藏。反过来想一下,基本上不会指定成其它情况了吧。
总结
这次。介绍了遮挡剔除和深度測试。不管那一个都是使用enable函数来设置有效,使用disable函数来设置无效。enable和disable这两个函数的參数是一致的,依据传入的參数不同,能够设定各种属性设置为有效或者无效。
遮挡剔除设置为有效的话,内側的多边形就不会描画了,这样就减轻了画图的负担。深度測试在模拟有深度概念的三维空间时有着非常关键的数据。指定为正确的评价方法的话,就能像现实世界一样。近处的物体会将远处的物体遮挡住。
这次做的demo,能够自由切换遮挡剔除的有效和无效,并且能够自由指定多边形的内測和外側,demo页面的单选框选中或者不选。能够切换对应的状态,而深度測试也时能够自由切换有效或是无效的,能够通过实际操作来观察一下,深入理解一下遮挡剔除和深度測试。
demo的内容补充
demo中绘制了四个角的多边形,一共绘制了两个四边形。一个是沿着X轴旋转,还有一个是沿着Y轴旋转。并且这两个四边形都绕着原点进行着旋转移动,将深度測试设置为有效的话,里面的四边形就会被外面的四边形遮住了。
细致看demo的代码的话,就应该能知道,这两个四边形都各自是一个面向里側。一个面向外側的三角形组成的。这种话。将遮挡剔除设置为有效的话,多边形的上下部分就仅仅能绘制一个了。
顶点的连接顺序,看一下定义的索引缓存的数组的话。就明确了,以下是代码。
>定义索引的数组的代码
// 保存顶点属性的数组
var position = [
0.0, 1.0, 0.0,
1.0, 0.0, 0.0,
-1.0, 0.0, 0.0,
0.0, -1.0, 0.0
]; // 保存顶点的索引的数组
var index = [
0, 1, 2,
1, 2, 3
];
看一下上面的图和代码。然后比較一下。就明确是定义了面向内側和外側两个三角形来生成四边形了。这是为了測试遮挡剔除而专门这么定义的。正常来说。制作3D模型的时候。是不会像这样将里側和外側混在一起定义的,否则用遮挡剔除的话。模型就会出现穿孔了。
这次的demo能够通过以下的链接来測试。
遮挡剔除和深度測试的demo
[WebGL入门]十九,遮挡剔除和深度測试的更多相关文章
- [WebGL入门]十八,利用索引缓存来画图
注:文章译自http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明.我会加上[lufy:].另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
- OpenGL学习脚印:深度測试(depth testing)
写在前面 上一节我们使用AssImp载入了3d模型,效果已经令人激动了.可是绘制效率和场景真实感还存在不足,接下来我们还是要保持耐心,继续学习一些高级主题,等学完后面的高级主题,我们再次来改进我们载入 ...
- Android +NDK+eclipse+opengl ES2.0 开启深度測试
參考:https://www.opengl.org/discussion_boards/showthread.php/172736-OpenGL-ES-Depth-Buffer-Problem 环境: ...
- JNI/NDK开发指南(九)——JNI调用性能測试及优化
转载请注明出处:http://blog.csdn.net/xyang81/article/details/44279725 在前面几章我们学习到了.在Java中声明一个native方法,然后生成本地接 ...
- [WebGL入门]十四,绘制多边形
注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外,鄙人webgl研究还不够深入.一些专业词语,假设翻译有误,欢迎大家 ...
- [WebGL入门]十六,绘制多个模型
注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外.鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家 ...
- [WebGL入门]十五,为多边形涂抹颜色(顶点颜色的指定)
注:文章译自http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家指 ...
- Kinect for Windows SDK开发入门(十九):Kinect Fusion
Kinect for Windows SDK1.7中引入了Kinect Fusion功能.在1.8的SDK中对该功能进行了改进和强化,Kinect Fusion能够使得我们使用Kinect f ...
- [WebGL入门]十,矩阵计算和外部库
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
随机推荐
- Android SDK及ADT更新访问问题的解决办法
一.访问问题Eclipse使用SDK Manager更新时总是出现问题 Failed to fetch URL https://dl-ssl.google.com/android/repository ...
- C#语法糖: 扩展方法(常用)
今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法.大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做.我先说一下我没有学习到 ...
- android 隔几秒再执行
今天做项目,需要前面的方法执行完等待2秒在关闭当前页面.之前使用的是Thread.sleep(2000)发现根本没有作用.经过多次尝试,发现需要使用以下方法才能实现: new Thread(){ pu ...
- 全世界最详细的图形化VMware中linux环境下oracle安装(三)【weber出品必属精品】
数据库软件和数据库都建好了,基本上可以说完成90%的工作,但是美中不足的就是企业管理器还没有安装好,现在我们就开始安装企业管理器吧. 安装之前我们先将补丁给补上.补丁我们也是采用禁默安装.补丁:p83 ...
- js 计算某年某周日期范围
<HTML><HEAD><script type="text/javascript"> //目前只判断了4位有效输入的年份,//日期输出格式已处 ...
- java的InputStream和InputStreamReader有什么区别??
解释一: InputStream 此抽象类是表示字节输入流的所有类的超类 InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符.它使用 ...
- Mysql学习(慕课学习笔记3)数据类型
数据类型 数据类型是指.存储过程参数.表达式和局部变量的数据特征, 它决定了数据的存储格式,代表了不同的信息类型. 整型 Tinyint 有符号位 -128到127 无符号位 0到255 ...
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- Web项目中用模板Jsp页面引入所有静态样式脚本文件(js,css等)
这样的好处是不需要再每个页面中都添加太多的外链接(不会减少请求数量),但对开发会更快捷,如果更改这些文件的位置或名称,只需要更改模板文件,不需要一个一个页面复制粘贴:同时可以为不同jsp页面组创建不同 ...
- windows安装Apache HTTP服务器报错:无法启动,因为应用程序的并行配置不正确
Apache HTTP服务器安装后报:无法启动,因为应用程序的并行配置不正确-(已解决) 0条评论 [摘要:本创做品,出自 “深蓝的blog” 专客,迎接转载,转载时请务必说明出处,不然有权穷究版 ...