码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JavaScript WebGL 绘制顺序


    引子

    在 JavaScript WebGL 三维相关概念中尝试一些效果的时候,又碰到了新问题,就去查了资料,自己尝试后总结下。

    • Origin
    • My GitHub

    绘制顺序

    之前二维绘制顺序并没有产生明显的不好效果,现在绘制三维影响就比较大了。

    先看看二维相同一套顶点不同顺序的效果:

    • 二维面顺序示例 1
    • 二维面顺序示例 2

    面的颜色始终保持一致,但顺序变了,发现 WebGL 默认情况下会按照缓冲区中顺序绘制,也就是后绘制的图形会覆盖先绘制的图形。这个就像一层一层贴纸一样,比较符合一般认知,所以在二维绘制时并没发现明显不对劲的地方。

    关于三维绘制顺序先思考一下:三维的顶点坐标有三个分量,第三个分量是在 z 轴上表示深度信息,默认垂直屏幕向内为负方向,那么 z 值越大表示离屏幕越近,既然都有区分的依据,直接按照这个顺序绘制应该就可以了。实际试试:

    • 三维面顺序示例 1
    • 三维面顺序示例 2

    发现示例 2 中 z 分量的设置并没有效果,还是跟二维绘制面顺序一样。查资料说要开启隐藏面消除功能:

    gl.enable(gl.DEPTH_TEST)
    
    • 1

    再来看看示例 2 开启 DEPTH_TEST,发现还是没有效果,找到网上的一些示例并进行对比,发现还需要投影,才能看到效果,见示例 2 开启 DEPTH_TEST 且产生正确投影。

    深度冲突

    开启隐藏面消除功能之后,在绘制两个很靠近的面时,可能会出现显示异常的情况,这个现象称为深度冲突(Z fighting)。这里有两类这个现象的示例:

    • drawArrays 执行一次绘制,里面包含了两个面示例1
    • drawArrays 执行两次绘制,单独绘制的两个面示例2

    示例 1 的情况是一次绘制多个面,通过调整 z 分量比较容易解决。

    示例 2 的情况是多次绘制多个面,不确定性相对更强,这个时候可以借助 多边形偏移(polygon offset) 来解决。在两次绘制之间指定偏移:

      // 代码省略
      gl.enable(gl.POLYGON_OFFSET_FILL);
      gl.drawArrays(gl.TRIANGLES, 0, 3); // 开启多边形偏移
      gl.polygonOffset(1, 1); // 指定偏移
      gl.drawArrays(gl.TRIANGLES, 3, 3);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这是示例。

    polygonOffset(factor, units) 指定加到每个顶点绘制 z 值上的偏移量,两个参数都是比例因子,最终值的计算公式是 factor × DZ + r × units ,其中 DZ 是顶点所在表面相对于观察者视线的角度, r 是设备能够解析偏移量的最小值。这个方法对于渲染隐藏线图像、将贴花应用于表面以及渲染具有高亮显示边缘立体图形很有用。

    参考资料

    • polygonOffset mdn
    • WebGL编程指南在线版
  • 相关阅读:
    使用 Amazon Bedrock 和 RAG 构建 Text2SQL 行业数据查询助手
    Python爬虫实战:从API获取数据
    云计算 3月11号 (NFS远程共享存储及vsftpd配置)
    【算法】算法题总结
    LD链接脚本
    HTC手机如何进行官方解锁Unlock
    Python机器视觉--OpenCV进阶(核心)--特征检测与匹配基本概念解释
    重磅干货:多维度深入总结MySQL锁机制
    Django数据库重新初始化
    Linux 进程管理
  • 原文地址:https://blog.csdn.net/u011194386/article/details/126220716
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号