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

Three.js 马赛克教程

马赛克 ·Mosaic Shader· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • ShaderMaterial 自定义着色器实现核心视觉效果
  • OrbitControls 相机轨道交互
  • requestAnimationFrame渲染循环与resize自适应

效果说明

本案例演示马赛克效果:基于 WebGL 实现「马赛克」可视化效果,附完整可运行源码;核心用到 ShaderMaterial、OrbitControls。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

  • Scene / Camera / WebGLRenderer构成最小渲染闭环;大场景可开logarithmicDepthBuffer缓解 Z-fighting。
  • ShaderMaterial通过uniforms+ 自定义 GLSL 控制逐像素/逐点效果;透明粒子常配合depthTest: false
  • OrbitControls提供轨道旋转/缩放;开启enableDamping后需在 animate 中controls.update()

实现步骤

  • 搭建 Scene、PerspectiveCamera、WebGLRenderer,挂载 canvas 并处理resize
  • 定义 uniforms / onBeforeCompile 或 ShaderMaterial,编写 GLSL 与材质参数
  • 创建 OrbitControls(及 Raycaster 等交互控件,若源码包含)
  • requestAnimationFrame循环中更新状态并 render(Cesium 为viewer.render或自动渲染)
  • 代码要点

    import * as THREE from 'three'

    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' import * as dat from 'dat.gui'

    const box = document.getElementById('box')

    const scene = new THREE.Scene()

    const camera = new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 1000)

    camera.position.set(0, 0, 1)

    const renderer = new THREE.WebGLRenderer()

    renderer.setSize(box.clientWidth, box.clientHeight)

    box.appendChild(renderer.domElement)

    new OrbitControls(camera, renderer.domElement)

    animate()

    function animate() {

    requestAnimationFrame(animate)

    renderer.render(scene, camera)

    }

    window.onresize = () => {

    renderer.setSize(box.clientWidth, box.clientHeight)

    camera.aspect = box.clientWidth / box.clientHeight

    camera.updateProjectionMatrix()

    }

    const vertexShader =varying vec2 vUv; void main(){ vUv = uv; gl_Position = projectionMatrixmodelViewMatrixvec4(position, 1.0); }

    const fragmentShader =varying vec2 vUv; uniform sampler2D tDiffuse; uniform vec2 vScreenSize; uniform float fMosaicScale; void main() { vec2 vUv2 = vUv; vUv2.x = floor(vUv2.x * vScreenSize.x / fMosaicScale) / (vScreenSize.x / fMosaicScale) + (fMosaicScale / 2.0) / vScreenSize.x; vUv2.y = floor(vUv2.y * vScreenSize.y / fMosaicScale) / (vScreenSize.y / fMosaicScale) + (fMosaicScale / 2.0) / vScreenSize.y;

    vec4 color = texture2D(tDiffuse, vUv2); gl_FragColor = color; }

    const uniforms = {

    tDiffuse: { type: 't', value: new THREE.TextureLoader().load(HOST + 'files/author/z2586300277.png') },

    vScreenSize: { type: "v2", value: new THREE.Vector2(window.innerWidth, window.innerHeight) },

    fMosaicScale: { type: "f", value: 20.0 },

    }

    const material = new THREE.ShaderMaterial({ uniforms, vertexShader, fragmentShader });

    const geometry = new THREE.PlaneGeometry();

    const mesh = new THREE.Mesh(geometry, material);

    scene.add(mesh);

    var gui = new dat.GUI(); gui.add(uniforms['fMosaicScale'], 'value', 1.0, 100.0).step(1.0).name('mosaicScale');

    完整源码:GitHub

    小结

    • 本文提供马赛克完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
http://www.jsqmd.com/news/1142285/

相关文章:

  • 如何免费使用这款强大的AI图像增强工具:Real-ESRGAN-ncnn-vulkan终极完整指南
  • 4-20mA电流环原理与STM32F303K8采集方案详解
  • 嵌入式系统电源管理:TPS65263多路降压转换器设计与优化
  • IoT 物模型 + 客户端 SDK:乐橙摄像头、门锁、传感器统一上云管控
  • M24256E与PIC18F47K40组合的嵌入式存储可靠性设计
  • PotPlayer百度翻译插件:5分钟实现免费实时字幕翻译的完整指南
  • 如何在15分钟内完成黑苹果EFI配置:智能自动化工具完整指南
  • LLM评估框架实战指南:DeepEval解决AI系统质量监控难题
  • D2DX现代化补丁终极指南:让经典暗黑2在现代PC上焕发新生
  • 嵌入式矩阵键盘硬件设计与PIC单片机优化实践
  • 硬真理与学术泡沫——对当代科学话语体系的祛魅与重建
  • TPAFE0808与PIC18F45K22的多通道信号采集方案
  • KMR221与STM32F303VE在医疗电源监控中的高精度方案
  • 3步完成Switch控制器PC适配:BetterJoy终极配置指南
  • 飞腾 D2000/D3000 与 Intel X86 主板电源设计对比:5个关键差异与实测纹波数据
  • 嵌入式系统多电压供电方案:TPS65263与PIC18F45K22实战
  • 小程序搭建完整全流程,2026年7月全国4款小程序制作工具综合评测:功能、使用场景大对比,含零代码SAAS、AI编程、源码定制交付
  • 3步快速解锁网易云音乐:ncmdump工具的完整指南
  • K4FBE3D4HB-KHCL选型指南:LPDDR4工业级温度等级对比与宽温内存选型建议
  • 传统企业跨界数字创新(2000-2024)
  • 聚类评估指标实战:5大外部指标(Purity/NMI/ARI/RI/F)在Scikit-learn中的实现与对比
  • MC6470与PIC18LF4525的6DoF运动控制实现
  • LP5812与PIC18LF4610实现高效RGB LED控制方案
  • RFID医用智能冰箱厂家有哪些?多场景适用的医用冷链智能化厂商梳理
  • AI教材编写新突破!低查重AI写教材工具,快速生成20万字优质教材!
  • C++容器——list的基础实现
  • 分布式光伏SaaS平台推荐:2026年最适合中小EPC和代理商的工具
  • VMware Ubuntu 虚拟机磁盘已扩容,为什么还是无法启动?(磁盘100%占满解决方案)
  • 终极PS3游戏管理器IRISMAN:破解版玩家的完整解决方案
  • 终极离线Minecraft启动器:在无网络环境下自由畅玩