当前位置: 首页 > news >正文

WebGL开发技巧

一  、 标志板

        标志板技术的基本原理是使用纹理距形绘制植物。技术的关键点如下:

        1、每棵植物用一个纹理距形绘制,纹理距形采用内容为植物的透明背景纹理图。要使用恰当的混合 因子使植物 产生遮挡效果。

        2、纹理距形朝向要永远正对摄像机。

        案例关键代码:

        表示棵植物,实现植物的绘制且根据摄像机位置计算植物面的朝向,具体代码如下:

QQQ:function SingleTree (x, z, yAngle, tg) {tg=new TreeGroup();               //获取植物的数组引用this.x=x;                         //该植物的x位置this.z=z;                         //该植物的y位置this.yAngle=yAngle;               //植物纹理图的旋转角度this.tg=tg;this.drawSelf=function(ms, texture) {ms.pushMatrix();                //保护现场ms.translate(x, 0, z);         //将植物平移到对应位置ms.rotate(yAngle, 0, 1, 0);    //将纹理图旋转到对应角度tfd.drawSelf(ms, texture);      //树的绘制ms.popMatrix();                 //恢复现场}this.calculateBillboardDirection=function(){ //根据摄像机位置计算树木面的         var xspan=x-cx;      //计算从植物位置到摄像机位置的x分量var zspan=z-cz;      //计算从植物位置到摄像机位置的z分量if(zspan<=0) {       //根据向量中的两个分量计算出纹理矩形绕y轴旋转的角度yAngle=180/Math.PI *(Math.atan(xspan/zspan));} else{yAngle=180+180/Math.PI *(Math.atan(xspan/zspan));         }}}

        表示一组植物,其中包含植物 的位置 以及每个植物的朝向各绘制,代码如下:

function TreeGroup(gl) {this.treeGroupadd=function(gl) {               //向数组中添加植物的位置alist.push(new SingleTree(0,0,0, this));   //植物的位置alist.push(new SingleTree(8,0,10, this));  //植物的位置alist.push(new SingleTree(5.7,5.7,0, this));  //植物的位置alist.push(new SingleTree(0, -8,0, this));     //植物的位置alist.push(new SingleTree(-5.7,5.7,0, this)); //植物的位置alist.push(new SingleTree(-8,0,0, this));     //植物的位置alist.push(new SingleTree(-5.7, -5.7,0, this)); //植物的位置alist.push(new SingleTree(0,8,0, this));      //植物的位置alist.push(new SingleTree(5.7, -5.7,0, this)); //植物的位置}this.calculateBillboardDirection=function(){  //计算列表中每个树木的朝向             for(var i=0; i<alist.length; i++){      //循环遍历数组中的元素                      alist[i].calculateBillboardDirection(); //计算每个植物纹理矩形的朝向}}this.drawSelf=function(ms, texture) {             //绘制列表中的每个树木            for(var i=0; i<alist.length; i++){        //循环遍历数组中的元素alist[i].drawSelf(ms, texture);      //调用drawSelf方法绘制植物}}}

二、   灰度图地形

        1、基本思想 :灰度图地形就是用网格表示地形,同时提供一幅对应尺寸的灰度图,根据灰度图的每个像素的灰度来确定网格顶点的海拔,值为0表示最低位置,值为255表示最高位置 。可用如下公式计算顶点的海拔高度:

                实际海拔=最低海拔+最大高差X像素值 /255.0

        2、过程纹理:

  过程纹理是通过计算在运行时生成纹理,而不是从图像文件中加载,可以用来增强动态地形效果。具体使用过程如下: 

        (1)绑定纹理,为纹理分配编号,传送过程纹理起始y坐标,跨度进入渲染管线。

        (2)在顶点着色器中增加将顶点y坐标通过out类型变量传递给片元着色器。

        (3)在片元着色器中同时使用两种纹理对地形着色,小于过程纹理起始y坐标用编号0着色,大于起如y坐标加跨度时用编号1着色,介于两者之间用两者按比例混合着色。

        3、Mipmap地形

        使用此技术可以改善地形中远处山体比近处山体更加清晰的问题,还可以提升性能。

需要纹理空间接近普通纹理的两倍。使用步骤 如下:

        (1)设置纹理采样方式为Mipmap。

        (2)自动生成Mipmap系列纹理图

三、高真实感地形

        灰度图地形缺点: 无光照效果,层次感,山地各个方向上视觉效果没有差异。

        基本思路: (1)计算每个顶点位置的同时计算其法向量,增加光照效果

                            (2)纹理图增加为6幅,基中一幅为基础颜色纹理图,有四幅是不同的外观的细节纹理 ,包含灰色岩石、硬泥土、大理石、绿草皮,另外一幅作为过程纹理图,其R、G、B、,A色彩通道分别记录地形上每个位置 的细节纹理系数。

四、天空盒与天空穹

        天空盒:将场景放置在一个很大的立方体中,立方体每个面是一个纹理正方形,用于观察场景的摄像机需要放置在天空盒立方体的内部。

        天空穹:使用一个半球面模拟天空,此半球面需要天空的纹理图。

五、简单镜像 

        基本原理 :WebGL绘制实体时,采用系统默认的逆时针卷绕方式,在绘制镜像时,由于镜像和实体是关于反射面对称 ,绘制镜像时采用顺时针卷绕方式。

六、 非真实感绘制

        真实感绘制: 模拟现实世界中真实物体的各种光影效果,包括物体的颜色以及光照情况等。使用较多颜色数,达到真实感 。

        非真实感绘制:使用较少的颜色数进行绘制达到非真实效果,从数学角度上讲,就是将颜色取值从连续函数转化为离散函数。

        实现策略:计算物体光照强度,取值(0.0-1.0),使用光照强度作为S纹理坐标,同时采用固定的T纹理坐标,进行纹理采样,对物体边缘进行描绘(通常采用黑色)

七、 描述边效果

        沿法线挤出轮廓:将物体没法线挤出一些,用需要描边的纯色进行绘制,然后用正常的方式绘制 物体,从而形成一个轮廓。

        从视空间挤出轮廓: 将顶点坐标以及法向量通过乘以最终变换距阵的方式变换到视空间,然后将视空间中的顶点坐标沿变换后视空间中的法向量挤出。

http://www.xdnf.cn/news/608779.html

相关文章:

  • 一些Dify聊天系统组件流程图架构图
  • Idea如果有参数,怎么debug
  • Grafana XSSOpenRedirectSSRF漏洞复现(CVE-2025-4123)
  • 一键生成专业流程图:Draw.io与AI结合的高效绘图指南
  • 生成式 AI:解锁人类创造力的智能引擎
  • 图解深度学习 - 特征工程(DL和ML的核心差异)
  • JavaScript篇:解密ES6的“藏宝图“:Set和Map的奇妙冒险
  • Don’t Shake the Wheel 论文阅读
  • PycharmFlask 学习心得2:路由
  • 中国软件行业 2024 年度分析报告
  • AI时代的弯道超车之第二十章:哪些工作AI是替代不了的
  • AtCoder Beginner Contest 406(ABCD)
  • 大疆制图跑飞马D2000的正射与三维模型
  • 在 Docker 中启动 Jupyter Notebook
  • 功能强大且易于使用的 JavaScript 音频库howler.js 和AI里如何同时文字跟音频构思想法
  • 【羊圈——状压 + DP / 记忆化搜索DP】
  • 【办公类-18-06】20250523(Python)“口腔检查涂氟信息”批量生成打印(学号、姓名、学校、班级、身份证、户籍、性别、民族)
  • 冒泡排序:轻松理解与实现
  • 新能源汽车产业链图谱分析
  • python学习day2:运算符+优先级
  • 【沉浸式求职学习day47】【JSP详解】
  • Java—— 网络爬虫
  • Redis 8.0 新增数据结构深度解析:从核心功能到生态重构
  • 【数据架构04】数据湖架构篇
  • Flutter跨平台通信实战|3步打通Android原生能力,实现底层API调用!
  • Flutter - 国际化
  • Flutter 3.32 升级要点全解析
  • ros2 humble安装ros-humble-tf2-tools
  • 布丁扫描高级会员版 v3.5.2.2| 安卓智能扫描 APP OCR文字识别小助手
  • 数字人交互系统哪家强?品牌技术对比!