webgl实现物体描边效果的方法介绍


Posted in Javascript onNovember 27, 2019

前言

终于把手头的事结束了,可以有时间来研究研究技术~作为一名3D开发人员,仅仅使用现有的引擎来开发项目不免有些浮于表面,多研究研究底层的实现更利于对3D开发整体的把控~于是我决定最近开始研究webgl一些特效的实现,希望能在秋招前对底层有更深入的理解。

在webgl中实现描边的效果有很多种方式,比如我写卡通风格着色器那篇文章讲到的(将视线投影到每个点的法线上,这个值越小越说明这个点靠近边缘),所以接下来介绍实现的另一种方式:法线延展法。

这种方法不用进行法线与视线之间的计算,而是将物体每个点的x、y、z坐标沿着该点的法线扩大一定的距离并且添加描边的颜色,然后在绘制原来的物体覆盖到上面,这样便实现了描边的效果。

这里将原物体覆盖到描边物体上面就有两种实现的方式:

1.先关闭深度检测,然后绘制描边物体,开启深度检测,绘制原物体。这样由于绘制描边物体时深度检测被关闭了,原物体就会覆盖在描边物体上绘制从而实现描边效果。缺点:当两个物体重合时会出现重合位置没有描边的情况,这是由于第二次绘制的东西覆盖到了第一次描边的物体上,所以先画的边自然就会被遮挡啦~

2.不关闭深度检测,开启背面剪裁,绘制描边物体时将卷绕方向置为顺时针方向(默认是逆时针),在进行绘制,绘制完成之后将卷绕方向设置回顺时针方向。这样背面剪裁的开启使得描边物体只能绘制出它的背面,这样便实现了描边效果,而且由于没有关闭深度测试,该物体的描边效果会根据其位置决定是否遮挡。

//绘制一帧画面的方法
  function drawFrame()
  {   
   //若还没有加载完则不绘制
   if(!ooTri || !mbTri) {return;}
   
   //清除着色缓冲与深度缓冲
   gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 
   
   //保护现场
   ms.pushMatrix();   
   //绕Y轴旋转
   ms.rotate(currentAngle,0,1,0);
//方法1
//   gl.disable(gl.DEPTH_TEST);      //启用深度缓冲写入
//   mbTri.drawSelf(ms);//绘制描边物体
//   gl.enable(gl.DEPTH_TEST);      //关闭深度缓冲写入
//   ooTri.drawSelf(ms);//绘制原物体
//方法2
   gl.enable(gl.CULL_FACE);      //开启剪裁
   gl.cullFace(gl.BACK);       //剪裁背面
   gl.frontFace(gl.CW);       //绘制顺序为顺时针
   mbTri.drawSelf(ms);//绘制描边物体
   gl.frontFace(gl.CCW);       //绘制顺序为逆时针
   ooTri.drawSelf(ms);//绘制原物体


   //恢复现场
   ms.popMatrix();
   
   //修改旋转角度
   currentAngle += incAngle;
   if (currentAngle > 360)
   {
    currentAngle -= 360; 
   }   
  } 
  其着色器代码如下:
uniform mat4 uMVPMatrix;       //总变换矩阵
attribute vec3 aPosition;         //顶点位置
attribute vec3 aNormal;         //顶点法向量
void main(){
 vec3 position=aPosition;      //获取此顶点位置
 position.xyz+=aNormal*0.4;    //将顶点位置沿法线方向挤出
 gl_Position = uMVPMatrix * vec4(position.xyz,1);//根据总变换矩阵计算此次绘制此顶点位置
}
<#BREAK_BN#>
precision mediump float;        //设置浮点默认精度

void main(){
 gl_FragColor = vec4(0.0,1.0,0.0,0.0);     //给此片元颜色值
}

其实这两种描边方法还是有着一些区别(第二种对于复杂物体会产生类似包裹的效果)具体效果还得根据具体的场景来决定。

PS:这里还要注意一点,WebGL是个状态机。我们可以这么理解,假设WebGL中的属性P的值为1,你在某一次操作中,把P的值设置成了2,那么在你下一次设置P的值之前,P的值永远是2。这一点很重要!

Github地址:https://github.com/StringKun/WebGL-object-of-stroke

webgl实现物体描边效果的方法介绍

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
用javascript控制iframe滚动的代码
Apr 10 Javascript
对JavaScript的eval()中使用函数的进一步讨论
Jul 26 Javascript
JS backgroundImage控制
May 19 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
Dec 02 Javascript
返回对象在当前级别中是第几个元素的实现代码
Jan 20 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
Feb 22 Javascript
跟我学习javascript的Date对象
Nov 19 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
Nov 30 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
May 31 Javascript
Angular2 之 路由与导航详细介绍
May 26 Javascript
JS实现的3des+base64加密解密算法完整示例
May 18 Javascript
vue-cli3脚手架的配置及使用教程
Aug 28 Javascript
three.js利用卷积法如何实现物体描边效果
Nov 27 #Javascript
Angular8引入百度Echarts进行图表分析的实现代码
Nov 27 #Javascript
vue实现浏览器全屏展示功能
Nov 27 #Javascript
js中apply和call的理解与使用方法
Nov 27 #Javascript
vue-cli在 history模式下的配置详解
Nov 26 #Javascript
js实现淘宝首页的banner栏效果
Nov 26 #Javascript
JS实现排行榜文字向上滚动轮播效果
Nov 26 #Javascript
You might like
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
jquery text()要注意啦
2009/10/30 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
javascript 函数参数限制说明
2010/11/19 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
Javascript中的 “&amp;” 和 “|” 详解
2017/02/02 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
python实现图片变亮或者变暗的方法
2015/06/01 Python
Python编程中的文件操作攻略
2015/10/16 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
进程的查看和调度分别使用什么命令
2013/12/14 面试题
资深生产主管自我评价
2013/09/22 职场文书
自动化系在校本科生求职信
2013/10/23 职场文书
医学检验专业大学生求职信
2013/11/18 职场文书
入党申请人的自我鉴定
2013/12/01 职场文书
挂职思想汇报
2013/12/31 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
杜甫草堂导游词
2015/02/03 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书