Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 0.学前说明

  • 1.Three.js快速入门

  • 2.几何体BufferGeometry

  • 3.模型对象、材质

  • 4.层级模型

  • 5.顶点UV坐标、纹理贴图

  • 6.加载外部三维模型(gltf)

    • 1. 建模软件绘制3D场景(Blender)
    • 2. GLTF格式简介 (Web3D领域JPG)
    • 3. 加载.gltf文件(模型加载全流程)
    • 4. OrbitControls辅助设置相机参数
    • 5. gltf不同文件形式(.glb)
    • 6. 模型命名(程序与美术协作)
    • 7. 递归遍历层级模型修改材质
    • 8. 外部模型材质是否共享的问题
    • 9. 纹理encoding和渲染器
      • 10. gltf模型更换.map(纹理.flipY)
    • 7.PBR材质与纹理贴图

    • 8.渲染器和前端UI界面

    • 9.生成曲线、几何体

    • 10.相机基础

    • 11.光源和阴影

    • 12.精灵模型Sprite

    • 13.后处理EffectComposer

    • 14.射线拾取模型

    • 15.场景标注标签信息

    • 16.关键帧动画

    • 17.动画库tween.js

    • Three.js教程
    • 6.加载外部三维模型(gltf)
    郭隆邦
    2023-01-28
    目录

    9. 纹理encoding和渲染器

    # 纹理.encoding和渲染器.outputEncoding

    如果没有特殊需要,一般为了正常渲染,避免颜色偏差,threejs代码中需要颜色贴图.encoding和渲染器.outputEncoding属性值保持一致。

    # 纹理对象Texture颜色空间编码属性.encoding

    纹理对象Texture颜色空间 (opens new window)编码属性.encoding有多个属性值,默认值是线性颜色空间THREE.LinearEncoding。

    • THREE.LinearEncoding:线性颜色空间
    • THREE.sRGBEncoding:sRGB (opens new window)颜色空间

    # 浏览器控制台查看Texture.encoding属性值

    const texture = new THREE.TextureLoader().load('./earth.jpg');
    texture.encoding = THREE.LinearEncoding;//默认值
    // THREE.LinearEncoding变量在threejs内部表示数字3000
    console.log('texture.encoding',texture.encoding);
    // 修改为THREE.sRGBEncoding,
    texture.encoding = THREE.sRGBEncoding;
    // THREE.sRGBEncoding变量在threejs内部表示数字3001
    console.log('texture.encoding',texture.encoding);
    

    THREE.LinearEncoding、THREE.sRGBEncoding其实在theeejs内部都表示一个数字,具体可以查看src目录下constants.js的源码文件。

    // constants.js源码部分截取
    export const LinearEncoding = 3000;
    export const sRGBEncoding = 3001;
    

    # gltfmap.encoding值

    threejs加载gltf模型,颜色贴图map属性.encoding的默认值是sRGB颜色空间THREE.sRGBEncoding。

    // 查看gltf所有颜色贴图的.encoding值
    gltf.scene.traverse(function(obj) {
        if (obj.isMesh) {
            if(obj.material.map){//判断是否存在贴图
                console.log('.encoding',obj.material.map.encoding);
            }
        }
    });
    // .encoding显示3001,说明是THREE.sRGBEncoding
    console.log('.encoding',mesh.material.map.encoding);
    

    # WebGL渲染器.outputEncoding

    .outputEncoding的默认值是线性空间THREE.LinearEncoding,和纹理对象.encoding默认值一样,如果颜色贴图.encoding的值是THREE.sRGBEncoding,为了避免颜色偏差,.outputEncoding的值也需要设置为THREE.sRGBEncoding。

    //解决加载gltf格式模型颜色偏差问题
    renderer.outputEncoding = THREE.sRGBEncoding;
    

    注意!最新版本属性名字有改变。渲染器属性名.outputEncoding已经变更为.outputColorSpace,具体参考6.3小节最后说明。

    # 单独加载的颜色贴图设置.encoding = THREE.sRGBEncoding

    如果webgl渲染器设置了renderer.outputEncoding = THREE.sRGBEncoding;,你单独加载图像返回的纹理对象需要设置 texture.encoding = THREE.sRGBEncoding;

    //解决加载gltf格式模型颜色偏差问题
    renderer.outputEncoding = THREE.sRGBEncoding;
    const texture = new THREE.TextureLoader().load('./earth.jpg');
    // 和webgl渲染器renderer.outputEncoding一致
    texture.encoding = THREE.sRGBEncoding;
    

    注意!!!最新版本,纹理对象属性名.encoding已经变更为.colorSpace。

    texture.colorSpace  = THREE.SRGBColorSpace;//设置为SRGB颜色空间
    
    8. 外部模型材质是否共享的问题
    10. gltf模型更换.map(纹理.flipY)

    ← 8. 外部模型材质是否共享的问题 10. gltf模型更换.map(纹理.flipY)→

    Theme by Vdoing | Copyright © 2016-2025 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式