溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

threejs后期處理的基本使用方法以及如何加特效

發(fā)布時間:2022-01-25 09:11:55 來源:億速云 閱讀:899 作者:柒染 欄目:開發(fā)技術(shù)

threejs后期處理的基本使用方法以及如何加特效,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

    前言

    后期處理:簡單的說就是先渲染一張圖存起來,在這張圖上面"添油加醋",處理完后再渲染到屏幕上。這一過程three進(jìn)行了封裝,使用現(xiàn)成的可以更快實(shí)現(xiàn)需求

    基本代碼

    // 引入后期處理基本的對象
    import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'
    import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js'
    ...
    //  因?yàn)槭墙榻B后期渲染,省略場景初始化等代碼
    
    // 初始化效果組合器
    this.EffectComposer = new EffectComposer(this.renderer)
    // 添加基本的渲染通道
    this.RenderPass = new RenderPass(this.scene, this.camera)
    // 把通道加入到組合器
    this.EffectComposer.addPass(this.RenderPass)
    
    // 渲染方法,不斷調(diào)用render()
    _animate() {
      requestAnimationFrame(this._animate.bind(this))
      // 組合器執(zhí)行渲染
     this.EffectComposer.render()
    }

    基本流程

    • 初始化一個效果組合器

    • 把需要用的若干通道(也就是要進(jìn)行的操作)依次添加到組合器中

    • 組合器會按順序執(zhí)行各通道內(nèi)的操作,上一通道的操作結(jié)果會傳遞給下一通道,直至最后都操作完,然后渲染到屏幕上

    核心函數(shù)介紹

    EffectComposer 效果組合器

    作用:管理了后期處理的過程,根據(jù)通道的插入順序,來執(zhí)行通道內(nèi)的代碼(主要為著色器代碼)

    構(gòu)造函數(shù)

    需要傳入平時初始化three場景時的渲染器WebGLRenderer, 用來后續(xù)渲染場景

    // 引入
    import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'
    
    this.EffectComposer = new EffectComposer(渲染器)
    重要方法:

    addPass

    this.EffectComposer.addPass(通道)

    給EffectComposer添加后期處理通道,可以添加多個,依次執(zhí)行

    render

    this.EffectComposer.render()

    渲染,循環(huán)調(diào)用通道的render()方法

    RenderPass 渲染通道

    構(gòu)造函數(shù)

    需要傳入初始化場景時生成的場景對象跟相機(jī)對象

    this.RenderPass = new RenderPass(this.scene, this.camera)

    RenderPass通道的作用是把場景和相機(jī)作為參數(shù)傳入,獲得場景的渲染結(jié)果,不對渲染結(jié)果做特定處理。
    簡單說就是RenderPass用來生成第一張?jiān)紙D,用來傳給后面通道使用,所以一般RenderPass會作為第一個通道

    重要屬性:

    renderToScreen

    默認(rèn)值是false,true將處理的結(jié)果保存到幀緩沖區(qū),false直接顯示在canvas畫布上面。

    ShaderPass 著色器通道

    需要傳入自定義的著色器代碼,控制渲染

    const effectCopyPass = new ShaderPass(著色器代碼)

    著色器代碼格式可以參照CopyShader.js three/examples/jsm/shaders/CopyShader.js

    官方案例

    鏈接

    threejs.org/examples/?q…

    官方有很多封裝好的通道,可以拿來直接使用

    threejs后期處理的基本使用方法以及如何加特效

    通道相關(guān)代碼位置

    three/examples/jsm/postprocessing/

    案例演示

    電脈沖故障風(fēng)效果

    threejs后期處理的基本使用方法以及如何加特效

    代碼
    // 引入
    import { GlitchPass } from 'three/examples/jsm/postprocessing/GlitchPass.js'
    // 初始化通道
    const Pass = new GlitchPass()
    // 將此通道結(jié)果渲染到屏幕
    Pass.renderToScreen = true
    // 把通道加入到組合器
    this.EffectComposer.addPass(Pass)

    描邊效果

    threejs后期處理的基本使用方法以及如何加特效

    代碼
    // 傳入長寬、場景、相機(jī)
    const Pass = new OutlinePass(new THREE.Vector2(this.width, this.height), this.scene, this.camera)
    // 將此通道結(jié)果渲染到屏幕
    Pass.renderToScreen = true
    // OutlinePass相關(guān)屬性設(shè)置
    Pass.visibleEdgeColor = new THREE.Color(76, 148, 156) // 可見邊緣的顏色
    Pass.hiddenEdgeColor = new THREE.Color(0, 1, 0) // 不可見邊緣的顏色
    Pass.edgeGlow = 1.0 // 發(fā)光強(qiáng)度
    Pass.usePatternTexture = false // 是否使用紋理圖案
    Pass.edgeThickness = 2.0 // 邊緣濃度
    Pass.edgeStrength = 2.0  // 邊緣的強(qiáng)度,值越高邊框范圍越大
    Pass.pulsePeriod = 0 // 閃爍頻率,值越大頻率越低
    
    // 一般生產(chǎn)環(huán)境中會配合鼠標(biāo)事件,來改變selectedObjects,使選中的物體描邊
    Pass.selectedObjects = [需要添加外邊框的網(wǎng)格模型]
    // 將通道加入組合器
    this.EffectComposer.addPass(Pass)

    泛光效果

    threejs后期處理的基本使用方法以及如何加特效

    BloomPass的參數(shù)
    • strength 泛光效果的強(qiáng)度,值越高明亮區(qū)域越明顯,較暗區(qū)域的亮度也會變高

    • kernelSize 泛光效果的偏移量

    • sigma 銳利程度,值越高,泛光越模糊

    • resolution 泛光效果的解析圖,值太低方塊化就會加重

    代碼
    // 引入
    import { BloomPass } from 'three/examples/jsm/postprocessing/BloomPass.js'
    import { CopyShader } from 'three/examples/jsm/shaders/CopyShader.js'
    import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js'
    
    // 參數(shù)默認(rèn)值strength = 1, kernelSize = 25, sigma = 4, resolution = 256
    const Pass = new BloomPass(2.5, 25, 0.1, this.width)
    // 加入到組合器
    this.EffectComposer.addPass(Pass)
    
    // BloomPass通道不能通過renderToScreen=true將結(jié)果渲染到屏幕上,
    // 所以需要再加一個通道effectCopyPass來完成輸出結(jié)果這一步
    // effectCopyPass通道沒有任何特殊效果, 只是輸出結(jié)果
    const effectCopyPass = new ShaderPass(CopyShader)
    effectCopyPass.renderToScreen = true
    // 加入到組合器
    this.EffectComposer.addPass(effectCopyPass)

    關(guān)于threejs后期處理的基本使用方法以及如何加特效問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI