学习threejs,使用EffectComposer后期处理惩罚组合器(接纳RenderPass、ShaderPass渲染通道),案例一

[复制链接]
发表于 2025-9-21 19:33:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师




一、🍀媒介

本文详细先容如何基于threejs在三维场景中使用使用EffectComposer后期处理惩罚组合器(接纳RenderPass、ShaderPass渲染通道),亲测可用。盼望能资助到您。一起学习,加油!加油!
1.1 ☘️THREE.EffectComposer 后期处理惩罚

THREE.EffectComposer 用于在three.js中实现后期处理惩罚效果。该类管理了产生终极视觉效果的后期处理惩罚过程链。 后期处理惩罚过程根据它们添加/插入的次序来实行,最后一个过程会被自动渲染到屏幕上。
1.1.1 ☘️代码示例

  1. import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
  2. import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
  3. // 初始化 composer
  4. const composer = new EffectComposer(renderer);
  5. // 创建 RenderPass 并添加到 composer
  6. const renderPass = new RenderPass(scene, camera);
  7. composer.addPass(renderPass);
  8. // 添加其他后期处理通道(如模糊)
  9. // composer.addPass(blurPass);
  10. // 在动画循环中渲染
  11. function animate() {
  12.   composer.render();
  13.   requestAnimationFrame(animate);
  14. }
复制代码
1.1.2 ☘️构造函数

[color=‌#00FFFF]EffectComposer( renderer : WebGLRenderer, renderTarget : WebGLRenderTarget )
renderer – 用于渲染场景的渲染器。
renderTarget – (可选)一个预先设置的渲染目标,内部由 EffectComposer 使用。
1.1.3 ☘️属性

[color=‌#00FFFF].passes : Array
一个用于体现后期处理惩罚过程链(包罗次序)的数组。
  1. 渲染通道:
  2. BloomPass   该通道会使得明亮区域参入较暗的区域。模拟相机照到过多亮光的情形
  3. DotScreenPass   将一层黑点贴到代表原始图片的屏幕上
  4. FilmPass    通过扫描线和失真模拟电视屏幕
  5. MaskPass    在当前图片上贴一层掩膜,后续通道只会影响被贴的区域
  6. RenderPass  该通道在指定的场景和相机的基础上渲染出一个新的场景
  7. SavePass    执行该通道时,它会将当前渲染步骤的结果复制一份,方便后面使用。这个通道实际应用中作用不大;
  8. ShaderPass  使用该通道你可以传入一个自定义的着色器,用来生成高级的、自定义的后期处理通道
  9. TexturePass 该通道可以将效果组合器的当前状态保存为一个纹理,然后可以在其他EffectCoposer对象中将该纹理作为输入参数
复制代码
[color=‌#00FFFF].readBuffer : WebGLRenderTarget
内部读缓冲区的引用。过程一样平常从该缓冲区读取先前的渲染效果。
[color=‌#00FFFF].renderer : WebGLRenderer
内部渲染器的引用。
[color=‌#00FFFF].renderToScreen : Boolean
终极过程是否被渲染到屏幕(默认帧缓冲区)。
[color=‌#00FFFF].writeBuffer : WebGLRenderTarget
内部写缓冲区的引用。过程常将它们的渲染效果写入该缓冲区。
1.1.4 ☘️方法

[color=‌#00FFFF].addPass ( pass : Pass ) : undefined
pass – 将被添加到过程链的过程
将传入的过程添加到过程链。
[color=‌#00FFFF].dispose () : undefined
开释此实例分配的 GPU 相关资源。每当您的应用步伐不再使用此实例时调用此方法。
[color=‌#00FFFF].insertPass ( pass : Pass, index : Integer ) : undefined
pass – 将被插入到过程链的过程。
index – 界说过程链中过程应插入的位置。
将传入的过程插入到过程链中所给定的索引处。
[color=‌#00FFFF].isLastEnabledPass ( passIndex : Integer ) : Boolean
passIndex – 被用于查抄的过程
如果给定索引的过程在过程链中是最后一个启用的过程,则返回true。 由EffectComposer所使用,来决定哪一个过程应当被渲染到屏幕上。
[color=‌#00FFFF].removePass ( pass : Pass ) : undefined
pass – 要从传递链中删除的传递。
从传递链中删除给定的传递。
[color=‌#00FFFF].render ( deltaTime : Float ) : undefined
deltaTime – 增量时间值。
实行所有启用的后期处理惩罚过程,来产生终极的帧,
[color=‌#00FFFF].reset ( renderTarget : WebGLRenderTarget ) : undefined
renderTarget – (可选)一个预先设置的渲染目标,内部由 EffectComposer 使用。
重置所有EffectComposer的内部状态。
[color=‌#00FFFF].setPixelRatio ( pixelRatio : Float ) : undefined
pixelRatio – 装备像素比
设置装备的像素比。该值通常被用于HiDPI装备,以阻止含糊的输出。 因此,该方法语义类似于WebGLRenderer.setPixelRatio()。
[color=‌#00FFFF].setSize ( width : Integer, height : Integer ) : undefined
width – EffectComposer的宽度。
height – EffectComposer的高度。
思量装备像素比,重新设置内部渲染缓冲和过程的巨细为(width, height)。 因此,该方法语义类似于WebGLRenderer.setSize()。
[color=‌#00FFFF].swapBuffers () : undefined
交换内部的读/写缓冲。
1.2 ☘️THREE.RenderPass

THREE.RenderPass用于将场景渲染到中心缓冲区,为后续的后期处理惩罚效果(如含糊、色调调整等)提供底子。
1.2.1 ☘️构造函数

[color=‌#00FFFF]RenderPass(scene, camera, overrideMaterial, clearColor, clearAlpha)


  • scene THREE.Scene 要渲染的 Three.js 场景对象。
  • camera THREE.Camera 场景对应的相机(如 PerspectiveCamera)。
  • overrideMaterial THREE.Material (可选) 覆盖场景中所有物体的材质(默认 null)。
  • clearColor THREE.Color (可选) 渲染前扫除画布的颜色(默认不自动扫除)。
  • clearAlpha number (可选) 扫除画布的透明度(默认 0)。
1.2.2 ☘️属性

[color=‌#00FFFF].enabled:boolean
是否启用此通道(默认 true)。设为 false 可跳过渲染。
[color=‌#00FFFF].clear:boolean
渲染前是否扫除画布(默认 true)。若需叠加多个 RenderPass,可设为 false。
[color=‌#00FFFF].needsSwap:boolean
是否必要在渲染后交换缓冲区(通常保持默认 false)。
1.2.3 ☘️方法

[color=‌#00FFFF].setSize(width, height)
调整通道的渲染尺寸(通常由 EffectComposer 自动调用)。
width: 画布宽度(像素)。
height: 画布高度(像素)。
1.3 ☘️THREE.ShaderPass

THREE.ShaderPass是 Three.js 后期处理惩罚模块的核心组件之一,答应开发者通过自界说着色器(Shader)实现恣意殊效,为后期处理惩罚链提供高度机动性。
1.3.1 ☘️构造函数

[color=‌#00FFFF]ShaderPass(shader, textureID)


  • shader Object 包罗着色器代码和 uniforms 的设置对象。
  • textureID string (可选) 输入纹理的 uniform 名称(默认 tDiffuse)。
1.3.2 ☘️属性

[color=‌#00FFFF].enabled:boolean
是否启用此通道(默认 true)。设为 false 可临时禁用效果。
[color=‌#00FFFF].uniforms:object
着色器 uniforms 的引用,支持动态修改参数:
  1. shaderPass.uniforms.uStrength.value = 0.8; // 修改自定义参数
复制代码
[color=‌#00FFFF].renderToScreen:boolean
是否直接渲染到屏幕(默认 false)。若为最后通道,需设为 true。
1.3.3 ☘️方法

[color=‌#00FFFF].setSize(width, height)
调整通道的渲染尺寸(通常由 EffectComposer 自动调用)。
width: 画布宽度(像素)。
height: 画布高度(像素)。
二、🍀使用EffectComposer后期处理惩罚组合器(接纳RenderPass、ShaderPass渲染通道)

1. ☘️实现思绪



  • 1、初始化renderer渲染器。
  • 2、初始化Scene三维场景scene。
  • 3、初始化camera相机,界说相机位置 camera.position.set,设置相机方向camera.lookAt。
  • 4、创建THREE.AmbientLight环境光源ambiLight,创建THREE.SpotLight聚光灯光源spotLight,设置spotLight位置、光强、投影,scene场景参加ambiLight和spotLight。
  • 5、加载多少模子:添加地面立方体网格对象cube,设置cube的材质、位置、旋转和投影信息,scene添加cube。添加三个立方体网格对象cube1、cube2、cube3,设置三个立方体的颜色和位置信息,scene添加cube1、cube2、cube3。添加‘libertStatue.obj’模子mesh,设置模子巨细、位置等信息,scene添加object。创建RenderPass、多个ShaderPass渲染通道,创建THREE.EffectComposer后期处理惩罚组合器composer,composer添加创建的渲染通道。界说controls方法,方法内界说gui控制ShaderPass殊效通道参数以及参数更新方法。界说render方法,实现cube1、cube2、cube3和模子mesh的旋转动画,调用composer的渲染方法render。详细代码参考下面代码样例。
  • 6、参加gui控制。参加stats监控监控器,监控监控帧数信息。
2. ☘️代码样例

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>学习threejs,使用EffectComposer后期处理组合器(采用RenderPass、ShaderPass渲染通道),案例一</title>
  5.     <script type="text/javascript" src="../libs/three.js"></script>
  6.     <script type="text/javascript" src="../libs/stats.js"></script>
  7.     <script type="text/javascript" src="../libs/dat.gui.js"></script>
  8.     <script type="text/javascript" src="../libs/OBJLoader.js"></script>
  9.     <script type="text/javascript" src="../libs/MTLLoader.js"></script>
  10.     <script type="text/javascript" src="../libs/OBJMTLLoader.js"></script>
  11.     <script type="text/javascript" src="../libs/postprocessing/EffectComposer.js"></script>
  12.     <script type="text/javascript" src="../libs/postprocessing/ShaderPass.js"></script>
  13.     <script type="text/javascript" src="../libs/postprocessing/RenderPass.js"></script>
  14.     <script type="text/javascript" src="../libs/postprocessing/MaskPass.js"></script>
  15.     <script type="text/javascript" src="../libs/shaders/CopyShader.js"></script>
  16.     <script type="text/javascript" src="../libs/shaders/BrightnessContrastShader.js"></script>
  17.     <script type="text/javascript" src="../libs/shaders/ColorifyShader.js"></script>
  18.     <script type="text/javascript" src="../libs/shaders/SepiaShader.js"></script>
  19.     <script type="text/javascript" src="../libs/shaders/RGBShiftShader.js"></script>
  20.     <script type="text/javascript" src="../libs/shaders/ColorCorrectionShader.js"></script>
  21.     <script type="text/javascript" src="../libs/shaders/MirrorShader.js"></script>
  22.     <script type="text/javascript" src="../libs/shaders/VignetteShader.js"></script>
  23.     <script type="text/javascript" src="../libs/shaders/HueSaturationShader.js"></script>
  24.     <script type="text/javascript" src="../libs/shaders/BlendShader.js"></script>
  25.     <script type="text/javascript" src="../libs/shaders/KaleidoShader.js"></script>
  26.     <script type="text/javascript" src="../libs/shaders/LuminosityShader.js"></script>
  27.     <script type="text/javascript" src="../libs/shaders/TechnicolorShader.js"></script>
  28.     <script type="text/javascript" src="../libs/shaders/UnpackDepthRGBAShader.js"></script>
  29.     <style>
  30.         body {
  31.             /* set margin to 0 and overflow to hidden, to go fullscreen */
  32.             margin: 0;
  33.             overflow: hidden;
  34.         }
  35.     </style>
  36. </head>
  37. <body>
  38. <div id="Stats-output">
  39. </div>
  40. <div id="WebGL-output">
  41. </div>
  42. <!-- Js 代码块-->
  43. <script type="text/javascript">
  44.     // 初始化
  45.     function init() {
  46.         var stats = initStats();
  47.         // 创建三维场景scene
  48.         var scene = new THREE.Scene();
  49.         // 创建相机
  50.         var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
  51.         // 创建渲染器webGLRenderer,设置webGLRenderer的背景色、大小和touy
  52.         var webGLRenderer = new THREE.WebGLRenderer();
  53.         webGLRenderer.setClearColor(new THREE.Color(0xaaaaff, 1.0));
  54.         webGLRenderer.setSize(window.innerWidth, window.innerHeight);
  55.         webGLRenderer.shadowMapEnabled = true;
  56.                 //设置相机的位置和方向
  57.         camera.position.x = 20;
  58.         camera.position.y = 30;
  59.         camera.position.z = 40;
  60.         camera.lookAt(new THREE.Vector3(-15, -10, -25));
  61.         // 添加聚光灯光源
  62.         var spotLight = new THREE.SpotLight(0xffffff);
  63.         spotLight.castShadow = true;
  64.         spotLight.position.set(0, 60, 50);
  65.         spotLight.intensity = 1;
  66.         spotLight.shadowMapWidth = 2048;
  67.         spotLight.shadowMapHeight = 2048;
  68.         spotLight.shadowCameraFov = 120;
  69.         spotLight.shadowCameraNear = 1;
  70.         spotLight.shadowCameraFar = 1000;
  71.         var ambiLight = new THREE.AmbientLight(0x444444);
  72.         scene.add(ambiLight);
  73.         scene.add(spotLight);
  74.         var plane = new THREE.BoxGeometry(1600, 1600, 0.1, 40, 40);
  75.         var cube = new THREE.Mesh(plane, new THREE.MeshPhongMaterial(
  76.                 {
  77.                     color: 0xffffff,
  78.                     map: THREE.ImageUtils.loadTexture("../assets/textures/general/plaster-diffuse.jpg"),
  79.                     normalMap: THREE.ImageUtils.loadTexture("../assets/textures/general/plaster-normal.jpg"),
  80.                     normalScale: new THREE.Vector2(0.6, 0.6)
  81.                 }));
  82.         cube.material.map.wrapS = THREE.RepeatWrapping;
  83.         cube.material.map.wrapT = THREE.RepeatWrapping;
  84.         cube.material.normalMap.wrapS = THREE.RepeatWrapping;
  85.         cube.material.normalMap.wrapT = THREE.RepeatWrapping;
  86.         cube.rotation.x = Math.PI / 2;
  87.         cube.material.map.repeat.set(80, 80);
  88.         cube.receiveShadow = true;
  89.         cube.position.z = -150;
  90.         cube.position.x = -150;
  91.         scene.add(cube);
  92.         var cube1 = new THREE.Mesh(new THREE.BoxGeometry(30, 10, 2), new THREE.MeshPhongMaterial({color: 0xff0000}));
  93.         cube1.position.x = -15;
  94.         cube1.position.y = 5;
  95.         cube1.position.z = 15;
  96.         cube1.castShadow = true;
  97.         scene.add(cube1);
  98.         var cube2 = cube1.clone();
  99.         cube2.material = cube1.material.clone();
  100.         cube2.material.color = new THREE.Color(0x00ff00);
  101.         cube2.position.z = 5;
  102.         cube2.position.x = -20;
  103.         scene.add(cube2);
  104.         var cube3 = cube1.clone();
  105.         cube3.material = cube1.material.clone();
  106.         cube3.material.color = new THREE.Color(0x0000ff);
  107.         cube3.position.z = -8;
  108.         cube3.position.x = -25;
  109.         scene.add(cube3);
  110.         var mesh;
  111.         // webGLRenderer 绑定html要素
  112.         document.getElementById("WebGL-output").appendChild(webGLRenderer.domElement);
  113.         var loader = new THREE.OBJMTLLoader();
  114.         loader.load('../assets/models/sol/libertStatue.obj', '../assets/models/sol/libertStatue.mtl',
  115.                 function (event) {
  116.                     var object = event;
  117.                     // fix for incorrect uvs.
  118.                     console.log(event);
  119.                     var geom = object.children[0].geometry;
  120.                     var uv3 = geom.faceVertexUvs[0][0];
  121.                     var uv4 = geom.faceVertexUvs[0][10];
  122.                     // fill in the missing ones
  123.                     for (var j = 0; j < 7616 - 7206; j++) {
  124.                         if (geom.faces[j + 7206] instanceof THREE.Face4) {
  125.                             geom.faceVertexUvs[0].push(uv4);
  126.                         } else {
  127.                             geom.faceVertexUvs[0].push(uv4);
  128.                         }
  129.                     }
  130.                     object.children.forEach(function (e) {
  131.                         e.castShadow = true
  132.                     });
  133.                     object.scale.set(20, 20, 20);
  134.                     mesh = object;
  135.                     mesh.position.x = 15;
  136.                     mesh.position.z = 5;
  137.                     scene.add(object);
  138.                 });
  139.         var mirror = new THREE.ShaderPass(THREE.MirrorShader);
  140.         mirror.enabled = false;
  141.         var hue = new THREE.ShaderPass(THREE.HueSaturationShader);
  142.         hue.enabled = false;
  143.         var vignette = new THREE.ShaderPass(THREE.VignetteShader);
  144.         vignette.enabled = false;
  145.         var colorCorrection = new THREE.ShaderPass(THREE.ColorCorrectionShader);
  146.         colorCorrection.enabled = false;
  147.         var rgbShift = new THREE.ShaderPass(THREE.RGBShiftShader);
  148.         rgbShift.enabled = false;
  149.         var brightness = new THREE.ShaderPass(THREE.BrightnessContrastShader);
  150.         brightness.uniforms.brightness.value = 0;
  151.         brightness.uniforms.contrast.value = 0;
  152.         brightness.enabled = false;
  153.         brightness.uniforms.brightness.value = 0;
  154.         brightness.uniforms.contrast.value = 0;
  155.         var colorify = new THREE.ShaderPass(THREE.ColorifyShader);
  156.         colorify.uniforms.color.value = new THREE.Color(0xffffff);
  157.         colorify.enabled = false;
  158.         var sepia = new THREE.ShaderPass(THREE.SepiaShader);
  159.         sepia.uniforms.amount.value = 1;
  160.         sepia.enabled = false;
  161.         var kal = new THREE.ShaderPass(THREE.KaleidoShader);
  162.         kal.enabled = false;
  163.         var lum = new THREE.ShaderPass(THREE.LuminosityShader);
  164.         lum.enabled = false;
  165.         var techni = new THREE.ShaderPass(THREE.TechnicolorShader);
  166.         techni.enabled = false;
  167.         var unpack = new THREE.ShaderPass(THREE.UnpackDepthRGBAShader);
  168.         unpack.enabled = false;
  169.         var renderPass = new THREE.RenderPass(scene, camera);
  170.         var effectCopy = new THREE.ShaderPass(THREE.CopyShader);
  171.         effectCopy.renderToScreen = true;
  172.         var composer = new THREE.EffectComposer(webGLRenderer);
  173.         composer.addPass(renderPass);
  174.         composer.addPass(brightness);
  175.         composer.addPass(sepia);
  176.         composer.addPass(mirror);
  177.         composer.addPass(colorify);
  178.         composer.addPass(colorCorrection);
  179.         composer.addPass(rgbShift);
  180.         composer.addPass(vignette);
  181.         composer.addPass(hue);
  182.         composer.addPass(kal);
  183.         composer.addPass(lum);
  184.         composer.addPass(techni);
  185.         composer.addPass(unpack);
  186.         composer.addPass(effectCopy);
  187.         var controls = new function () {
  188.             this.brightness = 0.01;
  189.             this.contrast = 0.01;
  190.             this.select = 'none';
  191.             this.color = 0xffffff;
  192.             this.amount = 1;
  193.             this.powRGB_R = 2;
  194.             this.mulRGB_R = 1;
  195.             this.powRGB_G = 2;
  196.             this.mulRGB_G = 1;
  197.             this.powRGB_B = 2;
  198.             this.mulRGB_B = 1;
  199.             this.rgbAmount = 0.005;
  200.             this.angle = 0.0;
  201.             this.side = 1;
  202.             this.offset = 1;
  203.             this.darkness = 1;
  204.             this.hue = 0.01;
  205.             this.saturation = 0.01;
  206.             this.kalAngle = 0;
  207.             this.kalSides = 6;
  208.             this.rotate = false;
  209.             this.switchShader = function () {
  210.                 switch (controls.select) {
  211.                     case 'none' :
  212.                     {
  213.                         enableShader();
  214.                         break;
  215.                     }
  216.                     case 'colorify' :
  217.                     {
  218.                         enableShader(colorify);
  219.                         break;
  220.                     }
  221.                     case 'brightness' :
  222.                     {
  223.                         enableShader(brightness);
  224.                         break;
  225.                     }
  226.                     case 'sepia' :
  227.                     {
  228.                         enableShader(sepia);
  229.                         break;
  230.                     }
  231.                     case 'colorCorrection' :
  232.                     {
  233.                         enableShader(colorCorrection);
  234.                         break;
  235.                     }
  236.                     case 'rgbShift' :
  237.                     {
  238.                         enableShader(rgbShift);
  239.                         break;
  240.                     }
  241.                     case 'mirror' :
  242.                     {
  243.                         enableShader(mirror);
  244.                         break;
  245.                     }
  246.                     case 'vignette' :
  247.                     {
  248.                         enableShader(vignette);
  249.                         break;
  250.                     }
  251.                     case 'hueAndSaturation' :
  252.                     {
  253.                         enableShader(hue);
  254.                         break;
  255.                     }
  256.                     case 'kaleidoscope' :
  257.                     {
  258.                         enableShader(kal);
  259.                         break;
  260.                     }
  261.                     case 'luminosity' :
  262.                     {
  263.                         enableShader(lum);
  264.                         break;
  265.                     }
  266.                     case 'technicolor' :
  267.                     {
  268.                         enableShader(techni);
  269.                         break;
  270.                     }
  271.                     case 'unpackDepth' :
  272.                     {
  273.                         enableShader(unpack);
  274.                         break;
  275.                     }
  276.                 }
  277.             };
  278.             this.changeBrightness = function () {
  279.                 brightness.uniforms.brightness.value = controls.brightness;
  280.                 brightness.uniforms.contrast.value = controls.contrast;
  281.             };
  282.             this.changeColor = function () {
  283.                 colorify.uniforms.color.value = new THREE.Color(controls.color);
  284.             };
  285.             this.changeSepia = function () {
  286.                 sepia.uniforms.amount.value = controls.amount;
  287.             };
  288.             this.changeCorrection = function () {
  289.                 colorCorrection.uniforms.mulRGB.value = new THREE.Vector3(controls.mulRGB_R, controls.mulRGB_G, controls.mulRGB_B);
  290.                 colorCorrection.uniforms.powRGB.value = new THREE.Vector3(controls.powRGB_R, controls.powRGB_G, controls.powRGB_B);
  291.             };
  292.             this.changeRGBShifter = function () {
  293.                 rgbShift.uniforms.amount.value = controls.rgbAmount;
  294.                 rgbShift.uniforms.angle.value = controls.angle;
  295.             };
  296.             this.changeMirror = function () {
  297.                 mirror.uniforms.side.value = controls.side;
  298.             };
  299.             this.changeVignette = function () {
  300.                 vignette.uniforms.darkness.value = controls.darkness;
  301.                 vignette.uniforms.offset.value = controls.offset;
  302.             };
  303.             this.changeHue = function () {
  304.                 hue.uniforms.hue.value = controls.hue;
  305.                 hue.uniforms.saturation.value = controls.saturation;
  306.             };
  307.             this.changeKal = function () {
  308.                 kal.uniforms.sides.value = controls.kalSides;
  309.                 kal.uniforms.angle.value = controls.kalAngle;
  310.             };
  311.             function enableShader(shader) {
  312.                 // we're not interested in the first or the last one
  313.                 for (var i = 1; i < composer.passes.length - 1; i++) {
  314.                     if (composer.passes[i] == shader) {
  315.                         composer.passes[i].enabled = true;
  316.                     } else {
  317.                         composer.passes[i].enabled = false;
  318.                     }
  319.                 }
  320.             }
  321.         };
  322.         var gui = new dat.GUI();
  323.         gui.add(controls, "select", ['none', "colorify", 'brightness', 'sepia', 'colorCorrection', 'rgbShift', 'mirror', 'vignette', 'hueAndSaturation', 'kaleidoscope', 'luminosity', 'technicolor']).onChange(controls.switchShader);
  324.         gui.add(controls, "rotate");
  325.         var bnFolder = gui.addFolder("Brightness");
  326.         bnFolder.add(controls, "brightness", -1, 1).onChange(controls.changeBrightness);
  327.         bnFolder.add(controls, "contrast", -1, 1).onChange(controls.changeBrightness);
  328.         var clFolder = gui.addFolder("Colorify");
  329.         clFolder.addColor(controls, "color").onChange(controls.changeColor);
  330.         var colFolder = gui.addFolder('Color Correction');
  331.         colFolder.add(controls, "powRGB_R", 0, 5).onChange(controls.changeCorrection);
  332.         colFolder.add(controls, "powRGB_G", 0, 5).onChange(controls.changeCorrection);
  333.         colFolder.add(controls, "powRGB_B", 0, 5).onChange(controls.changeCorrection);
  334.         colFolder.add(controls, "mulRGB_R", 0, 5).onChange(controls.changeCorrection);
  335.         colFolder.add(controls, "mulRGB_G", 0, 5).onChange(controls.changeCorrection);
  336.         colFolder.add(controls, "mulRGB_B", 0, 5).onChange(controls.changeCorrection);
  337.         var sepiaFolder = gui.addFolder("Sepia");
  338.         sepiaFolder.add(controls, "amount", 0, 2).step(0.1).onChange(controls.changeSepia);
  339.         var shiftFolder = gui.addFolder("RGB Shift");
  340.         shiftFolder.add(controls, "rgbAmount", 0, 0.1).step(0.001).onChange(controls.changeRGBShifter);
  341.         shiftFolder.add(controls, "angle", 0, 3.14).step(0.001).onChange(controls.changeRGBShifter);
  342.         var mirrorFolder = gui.addFolder("mirror");
  343.         mirrorFolder.add(controls, "side", 0, 3).step(1).onChange(controls.changeMirror);
  344.         var vignetteFolder = gui.addFolder("vignette");
  345.         vignetteFolder.add(controls, "darkness", 0, 2).onChange(controls.changeVignette);
  346.         vignetteFolder.add(controls, "offset", 0, 2).onChange(controls.changeVignette);
  347.         var hueAndSat = gui.addFolder("hue and saturation");
  348.         hueAndSat.add(controls, "hue", -1, 1).step(0.01).onChange(controls.changeHue);
  349.         hueAndSat.add(controls, "saturation", -1, 1).step(0.01).onChange(controls.changeHue);
  350.         var kalMenu = gui.addFolder("Kaleidoscope");
  351.         kalMenu.add(controls, "kalAngle", -2 * Math.PI, 2 * Math.PI).onChange(controls.changeKal);
  352.         kalMenu.add(controls, "kalSides", 2, 20).onChange(controls.changeKal);
  353.         render();
  354.         function render() {
  355.             stats.update();
  356. //
  357.             if (controls.rotate) {
  358.                 if (mesh) mesh.rotation.y += 0.01;
  359.                 cube1.rotation.y += 0.01;
  360.                 cube2.rotation.y += 0.01;
  361.                 cube3.rotation.y += 0.01;
  362.             }
  363.             requestAnimationFrame(render);
  364.             composer.render();
  365.         }
  366.         function initStats() {
  367.             var stats = new Stats();
  368.             stats.setMode(0);
  369.             stats.domElement.style.position = 'absolute';
  370.             stats.domElement.style.left = '0px';
  371.             stats.domElement.style.top = '0px';
  372.             document.getElementById("Stats-output").appendChild(stats.domElement);
  373.             return stats;
  374.         }
  375.     };
  376.     window.onload = init;
  377. </script>
  378. </body>
  379. </html>
复制代码
效果如下

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表