10 分钟调出复古半色调点阵:three.js DotScreenPass 实战指南

发布时间:2026/9/8 23:23:34

10 分钟调出复古半色调点阵:three.js DotScreenPass 实战指南
10 分钟调出复古半色调点阵three.js DotScreenPass 实战指南【免费下载链接】three.jsJavaScript 3D Library.项目地址: https://gitcode.com/GitHub_Trending/th/three.jsthree.js 的DotScreenPass是一个半色调后处理通道场景渲染完成后它把整幅画面重绘成密集圆点阵列让屏幕看起来像报纸印刷或老式点阵屏。读完这篇你能拿到一段可直接粘贴的接入代码以及一套运行时调节网点旋转与脉冲的配方。先让画面变味儿——最小可运行接入DotScreenPass是 addon 模块不在核心包里必须显式引入。下面这段代码把它接进场景渲染之后的后处理链import * as THREE from three; import { EffectComposer } from three/addons/postprocessing/EffectComposer.js; import { RenderPass } from three/addons/postprocessing/RenderPass.js; import { DotScreenPass } from three/addons/postprocessing/DotScreenPass.js; const composer new EffectComposer( renderer ); composer.addPass( new RenderPass( scene, camera ) ); composer.addPass( new DotScreenPass( new THREE.Vector2( 0, 0 ), 0.5, 0.8 ) ); function animate() { requestAnimationFrame( animate ); composer.render(); } animate();跑起来后整块画面被圆点阵列覆盖亮的地方点又大又亮暗的地方几乎沉进黑里颜色信息被点阵的明暗代替——就是报纸放大看的那种质感。这个构造写法在官方运行示例 examples/webgl_postprocessing_advanced.html 里原样出现。三个旋钮怎么拧——参数调优速查构造函数收三个参数对应三个旋钮网点从哪开始旋转、点阵斜多少、点有多大。new DotScreenPass( center, angle, scale );三个参数都是可选的省略就沿用着色器默认值参数含义默认值推荐范围center网点相位原点( 0.5, 0.5 )屏幕中心( 0, 0 )屏幕角落angle网点旋转角弧度1.57约 π/20 ~ 6.28scale网点密度越大点越小1.00.5 ~ 2.0把scale从 1.0 拖到 0.5颗粒感立刻粗一倍——相当于同一张网点底片是放大打印还是缩小打印的差别。angle设成0.5点阵会微微倾斜多几分手绘报纸的味道。让网点动起来——运行时动态调参 ✨pass.uniforms和材质共享同一份引用改完下一帧就生效无需重建 pass。把angle在动画帧里每次加一点网点就开始缓慢转圈const dotScreen new DotScreenPass( new THREE.Vector2( 0, 0 ), 0.5, 0.8 ); composer.addPass( dotScreen ); function animate() { requestAnimationFrame( animate ); dotScreen.uniforms.angle.value 0.01; dotScreen.uniforms.scale.value 0.6 0.3 * Math.sin( Date.now() * 0.001 ); composer.render(); } animate();跑起来后angle每帧加 0.01 让点阵慢转scale由正弦波驱动网点粗细来回呼吸。想让网点相位挪位置用dotScreen.uniforms.center.value.copy( new THREE.Vector2( 0.3, 0.7 ) )一行搞定。滤镜背后那 20 行着色器——半色调算法拆解视觉效果的核心是 DotScreenShader.js 里的片元着色器算法沿用了 glfx.js 的实现。关键代码就这么多float pattern() { float s sin( angle ), c cos( angle ); vec2 tex vUv * tSize - center; vec2 point vec2( c * tex.x - s * tex.y, s * tex.x c * tex.y ) * scale; return ( sin( point.x ) * sin( point.y ) ) * 4.0; } void main() { vec4 color texture2D( tDiffuse, vUv ); float average ( color.r color.g color.b ) / 3.0; gl_FragColor vec4( vec3( average * 10.0 - 5.0 pattern() ), color.a ); }拆成三步理解1取 RGB 平均值average当这个像素的灰度亮度2把 UV 换算到像素空间以center为原点按angle旋转、再乘scale——两个旋钮的数学来源就藏在这几行3对旋转后坐标分别取sin再相乘得到 [-1, 1] 间的周期性调制值放大 4 倍后叠加到average * 10.0 - 5.0的亮度基底上形成明暗靠点阵表达的半色调观感原图 alpha 原样保留。想自定义网点造型——45° 新闻纸排布、CMYK 彩色分色——改pattern()这一个函数再把自己的 ShaderMaterial 传给 pass 即可。组合拳实战——后处理链级联配置网点滤镜单飞能看级联出味道场景渲染 → 伽马校正 → 网点 → 渐晕。通道顺序直接决定最终观感比如伽马校正放在网点后面网点本身的黑白也会被校正整体色调明显变亮。下面这条链可直接嵌入项目import { ShaderPass } from three/addons/postprocessing/ShaderPass.js; import { GammaCorrectionShader } from three/addons/shaders/GammaCorrectionShader.js; import { VignetteShader } from three/addons/shaders/VignetteShader.js; const composer new EffectComposer( renderer ); composer.addPass( new RenderPass( scene, camera ) ); composer.addPass( new ShaderPass( GammaCorrectionShader ) ); const dotScreen new DotScreenPass( new THREE.Vector2( 0, 0 ), 0.5, 0.8 ); composer.addPass( dotScreen ); const vignette new ShaderPass( VignetteShader ); vignette.uniforms[ offset ].value 1.6; vignette.uniforms[ darkness ].value 0.95; composer.addPass( vignette );运行后画面是点阵质感加四角压暗一股老电影放映机的味道。offset/darkness取 1.6 和 0.95 来自官方 advanced 示例照抄不会出错。踩坑清单与资源释放 ⚠️漏调 dispose 会泄漏 GPU 资源动态重建后处理链时先把旧 pass 摘掉再释放chrome://gpu里 WebGL 纹理数不再上涨才算干净dotScreen.dispose();这一行会释放 ShaderMaterial 和全屏四边形几何体不执行的话这两块显存就一直挂着。scale与网点密度是反比数值越大点越小越细密越小点越大越粗。新手最常搞反第一次想调细结果调出一颗大圆点。渲染管线边界Pass基类模块注释明确只服务WebGLRenderer后处理。项目走 WebGPU TSL 的话请改用 DotScreenNode 文档 里的 Node 实现这个 Pass 不能原样搬过去。别手动设tDiffuse和tSizerender()每帧自动写入上一通道纹理和缓冲区宽高你自己设了也会被覆盖白忙活。如果你只带走这几句引入路径three/addons/postprocessing/DotScreenPass.js挂进EffectComposer才生效构造三参center/angle/scale全部可省省了就用默认值想要更细的网点把scale往大了调——它是反比动画帧里改uniforms下一帧即生效不用重建移除通道前dispose()一次显存还给你。参考官方文档Pass 源码着色器源码Pass 基类运行示例【免费下载链接】three.jsJavaScript 3D Library.项目地址: https://gitcode.com/GitHub_Trending/th/three.js创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

COMSOL锂电池热管理仿真:从单体建模到冷却方案对比

COMSOL锂电池热管理仿真:从单体建模到冷却方案对比

2026/9/8 23:23:34

做电池热管理仿真的人应该都有过这种经历:领导或者甲方拿到一张温度云图,第一句话往往是“这个最红的地方多少度?会不会炸?”,再补一句“换成水冷能不能压到45度以下?”。如果你只会拉着模型瞎调参数&#…

基于YOLOv8与ONNX的直肠息肉检测系统:从训练到GUI部署全解析

基于YOLOv8与ONNX的直肠息肉检测系统:从训练到GUI部署全解析

2026/9/8 23:13:34

简介:面向医学影像与目标检测开发者的直肠息肉检测系统完整实现,基于YOLOv8与PyQt5搭建,提供Python源码、ONNX推理模型和可视化GUI界面,适合希望快速掌握检测模型落地流程的初中级学习者。压缩包共32个文件,约10.38MB&…

智能体系统架构三座山:隔离、集成与治理的落地实践

智能体系统架构三座山:隔离、集成与治理的落地实践

2026/9/8 23:13:34

1. 智能体架构里的三座山:隔离、集成与治理到底卡在哪 聊智能体系统架构之前,先讲个我亲眼见过的场景。有个团队做了一个面向企业内部的智能体平台,一开始只接了个大模型API,业务方提需求,开发写Prompt,跑通…

回测胜率90%和92%差两个百分点,策略真的更优吗?

回测胜率90%和92%差两个百分点,策略真的更优吗?

2026/9/9 0:03:36

前两天有位朋友拿两份回测报告来问我:同样是自动交易的机器人策略,策略A胜率90%,策略B胜率92%,是不是B更厉害?我说先别急着换,单看这两个百分点的差距,大概率说明不了问题。很多做实盘交易、做量…

拆解OpenAI Codex:Rust CLI与AI Agent工程的样板实践

拆解OpenAI Codex:Rust CLI与AI Agent工程的样板实践

2026/9/9 0:03:36

最近 GitHub 热榜上的 OpenAI Codex 讨论度很高,我特意翻了一圈评论区,发现点赞最多的不是“AI 编程体验有多惊艳”,而是满屏的安装报错截图,以及围绕 Rust 和 JavaScript 生态的无休止争论。作为一个把这仓库翻过几遍的人&#x…

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

2026/9/9 0:03:36

拆开市面上不同价位的定时插座,你会发现一个有意思的现象:有的里面躺着一颗黑色的软封装芯片,丝印都看不清;有的则是一块小小的蓝色或绿色PCB,上面赫然印着STM8或者STC的字样。同样叫"定时插座",…

开关电源环路裕量测试实战:相位裕量与增益裕量详解

开关电源环路裕量测试实战:相位裕量与增益裕量详解

2026/9/9 0:03:36

1. 项目概述:为什么环路裕量测试是电子工程师绕不开的“体检项目”“从零开始的电子工程师生活(6)——环路裕量测试”,这个标题一出来,老电源工程师可能已经下意识摸了摸示波器探头,新同事则大概率在想&…

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

2026/9/9 0:03:36

简介:面向毕业设计场景的PyQt5扩散模型图像恢复项目,提供完整Python源码与项目说明,适合图像处理、深度学习方向的高年级本科生与研究生参考。项目在模块设计上覆盖图像处理、扩散模型、参数配置、用户界面与结果评估五部分,具体涉…

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解

2026/9/8 23:53:36

理解函数无 return 语句时返回 undefined——freeCodeCamp 基础 JavaScript 挑战逐行拆解 【免费下载链接】freeCodeCamp freeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free. 项目地址: https://gitcode.com/…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/8 22:37:26

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

2026/9/9 0:03:36

简介:面向毕业设计场景的PyQt5扩散模型图像恢复项目,提供完整Python源码与项目说明,适合图像处理、深度学习方向的高年级本科生与研究生参考。项目在模块设计上覆盖图像处理、扩散模型、参数配置、用户界面与结果评估五部分,具体涉…

开关电源环路裕量测试实战:相位裕量与增益裕量详解

开关电源环路裕量测试实战:相位裕量与增益裕量详解

2026/9/9 0:03:36

1. 项目概述:为什么环路裕量测试是电子工程师绕不开的“体检项目”“从零开始的电子工程师生活(6)——环路裕量测试”,这个标题一出来,老电源工程师可能已经下意识摸了摸示波器探头,新同事则大概率在想&…

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

2026/9/9 0:03:36

拆开市面上不同价位的定时插座,你会发现一个有意思的现象:有的里面躺着一颗黑色的软封装芯片,丝印都看不清;有的则是一块小小的蓝色或绿色PCB,上面赫然印着STM8或者STC的字样。同样叫"定时插座",…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…