• Threejs_08 纹理颜色的调整(颜色空间的设置)


    为什么写入的贴图颜色跟实际的颜色有差别呢?

    具体为啥我也不知道,总之就是threejs有两个颜色空间 一个是线性的 一个是rgb那种样式的,但是人眼对光照强度的感知并不是线性的,所以threejs的默认属性,到人眼中,看上去就是会有差异,所以我们要用颜色空间设置为sRGB,更能适应人眼的感光,所以看上去跟实际也就很相似了。

    颜色空间的设置

    1. //加载纹理
    2. let texture = textureLoader.load(
    3. "/public/texture/watercover/CityNewYork002_COL_VAR1_1K.png"
    4. );
    5. //设置颜色空间 (默认为线性)
    6. texture.colorSpace = THREE.SRGBColorSpace;
    7. // texture.colorSpace = THREE.LinearSRGBColorSpace;

     这个代码就能设置纹理的颜色空间为sRGB类型的,并且我们可以加入一个gui调试工具来进行对比开发,但是要注意的是,如果在运行时改变颜色空间的话,需要将纹理允许中途改变颜色空间的开关设置为true。

    1. //中途修改颜色空间的话 需要设置可以更新为true 不然会不显示效果
    2. gui
    3. .add(texture, "colorSpace", {
    4. sRGB: THREE.SRGBColorSpace,
    5. Linear: THREE.LinearSRGBColorSpace,
    6. })
    7. .onChange(() => {
    8. texture.needsUpdate = true;
    9. });

    这样就可以看我们的效果了

    默认线性效果

    sRGB效果

    全部代码

     

    1. //1.一个物体可以设置多个材质嘛
    2. //1.设置定点组
    3. //2 多个
    4. //导入 threejs
    5. import * as THREE from "three";
    6. //导入轨道控制器
    7. import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
    8. //导入lil.gui
    9. // import * as dat from "dat.gui"; // 旧
    10. import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";
    11. //导入hdr加载器
    12. import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js";
    13. // 创建场景
    14. const scene = new THREE.Scene();
    15. // 创建相机
    16. const camera = new THREE.PerspectiveCamera(
    17. 45, // 视角
    18. window.innerWidth / window.innerHeight, // 宽高比 窗口的宽高进行设置的
    19. 0.1, // 近平面 相机最近最近能看到的物体
    20. 1000 // 远平面 相机最远能看到的物体
    21. );
    22. // 创建渲染器
    23. const renderer = new THREE.WebGLRenderer();
    24. // 设置渲染器的大小 (窗口大小)
    25. renderer.setSize(window.innerWidth, window.innerHeight);
    26. // 将渲染器的dom元素添加到body中
    27. document.body.appendChild(renderer.domElement);
    28. camera.position.z = 5;
    29. // 为了看到z轴
    30. camera.position.y = 2;
    31. // 设置x轴
    32. camera.position.x = 2;
    33. //设置相机的焦点 (相机看向哪个点)
    34. camera.lookAt(0, 0, 0);
    35. //添加世界坐标辅助器 (红色x轴,绿色y轴,蓝色z轴)一个线段 参数为 线段长度
    36. const axesHelper = new THREE.AxesHelper(5);
    37. //添加到场景之中
    38. scene.add(axesHelper);
    39. // 添加轨道控制器 (修改侦听位置) 一般监听画布的事件 不监听document.body
    40. const controls = new OrbitControls(camera, renderer.domElement);
    41. // 这里传递阻塞掉了 会导致无法点击
    42. // const controls = new OrbitControls(camera, document.body);
    43. //渲染函数
    44. function animate() {
    45. controls.update();
    46. //请求动画帧
    47. requestAnimationFrame(animate);
    48. //旋转网格体
    49. // cube.rotation.x += 0.01;
    50. // cube.rotation.y += 0.01;
    51. //渲染
    52. renderer.render(scene, camera);
    53. }
    54. animate();
    55. //渲染
    56. // 监听窗口的变化 重新设置渲染器的大小 画布自适应窗口
    57. window.addEventListener("resize", () => {
    58. // 重新设置渲染器的大小
    59. renderer.setSize(window.innerWidth, window.innerHeight);
    60. // 重新设置相机的宽高比
    61. camera.aspect = window.innerWidth / window.innerHeight;
    62. // 重新计算相机的投影矩阵
    63. camera.updateProjectionMatrix();
    64. });
    65. //创建gui实例
    66. const gui = new GUI();
    67. // 创建纹理加载器
    68. const textureLoader = new THREE.TextureLoader();
    69. //加载纹理
    70. let texture = textureLoader.load(
    71. "/public/texture/watercover/CityNewYork002_COL_VAR1_1K.png"
    72. );
    73. //设置颜色空间 (默认为线性)
    74. texture.colorSpace = THREE.SRGBColorSpace;
    75. // texture.colorSpace = THREE.LinearSRGBColorSpace;
    76. //加载AO纹理 ao = 环境遮挡效果
    77. let aoMap = textureLoader.load(
    78. "/public/texture/watercover/CityNewYork002_AO_1K.jpg"
    79. );
    80. // 加载透明度贴图
    81. let alphaMap = textureLoader.load("/public/texture/door/height.jpg");
    82. //加载光照贴图
    83. let lightMap = textureLoader.load("/public/texture/colors.png");
    84. //加载高光贴图
    85. let specularMap = textureLoader.load(
    86. "/public/texture/watercover/CityNewYork002_GLOSS_1K.jpg"
    87. );
    88. // RGBELoader 实例化
    89. let rgbLoader = new RGBELoader();
    90. // 加载hdr贴图
    91. rgbLoader.load(
    92. "/public/texture/Alex_Hart-Nature_Lab_Bones_2k.hdr",
    93. (envMap) => {
    94. //设置球形映射
    95. envMap.mapping = THREE.EquirectangularReflectionMapping;
    96. //设置环境纹理
    97. scene.background = envMap;
    98. //设置环境贴图(场景)
    99. scene.environment = envMap;
    100. //设置plane 环境贴图
    101. planeMaterial.envMap = envMap;
    102. }
    103. );
    104. // 物料
    105. let planeGeometry = new THREE.PlaneGeometry(1, 1);
    106. // 材质
    107. let planeMaterial = new THREE.MeshBasicMaterial({
    108. color: 0xffffff,
    109. //纹理贴图
    110. map: texture,
    111. //允许透明
    112. transparent: true,
    113. //高光贴图
    114. specularMap: specularMap,
    115. });
    116. let plane = new THREE.Mesh(planeGeometry, planeMaterial);
    117. scene.add(plane);
    118. gui.add(planeMaterial, "aoMapIntensity").min(0).max(1).name("ao贴图强度");
    119. //动态的调整颜色空间
    120. // gui.add(texture, "colorSpace", {
    121. // sRGB: THREE.SRGBColorSpace,
    122. // Linear: THREE.LinearSRGBColorSpace,
    123. // });
    124. //中途修改颜色空间的话 需要设置可以更新为true 不然会不显示效果
    125. gui
    126. .add(texture, "colorSpace", {
    127. sRGB: THREE.SRGBColorSpace,
    128. Linear: THREE.LinearSRGBColorSpace,
    129. })
    130. .onChange(() => {
    131. texture.needsUpdate = true;
    132. });

     

  • 相关阅读:
    vue3+element-plus权限控制实现(el-tree父子级不关联情况处理)
    机器学习(十四):K均值聚类(kmeans)
    Dockcer上传hub和配置国内镜像源
    Java 集合框架:LinkedList 的介绍、使用、原理与源码解析
    关于我对线程安全问题中死锁的理解
    Redis性能滑坡:哈希表碰撞的不速之客【redis第二部分】
    es6模块化,怎么判断当前文件使用的是es6的模块化还是commenjs的模块化
    什么是RabbitMQ,RabbitMQ基本概念,RabbitMQ的使用场景
    linux命令学习(14)——linux tar命令
    elementui的使用以及容易出现的问题
  • 原文地址:https://blog.csdn.net/a_strong_pig/article/details/134528305