渲染结果图

门模型使用标准网格材质(MeshStandardMaterial),一种基于物理的渲染。使用PBR方式渲染。

思路:

(1) 建立立方体模

(2)设置基本颜色.map属性添加颜色贴图 color.png (贴图效果与颜色是叠加的)一个简单的带有纹理的立方体的们就成形了

.map : Texture

颜色贴图。可以选择包括一个alpha通道,通常与.transparent 或.alphaTest。默认为null。 纹理贴图颜色由漫反射颜色.color调节。

因此可以选择添加一个alpha贴图去除纹理门框边缘的位置,下面是文档给出的解释:

.alphaMap : Texture

alpha贴图是一张灰度纹理,用于控制整个表面的不透明度。(黑色:完全透明;白色:完全不透明)。 默认值为null。

(3)此时的门的边缘线并不明显,可以添加aoMap属性环境遮挡贴图。细化效果。

.aoMap : Texture

该纹理的红色通道用作环境遮挡贴图。默认值为null。aoMap需要第二组UV。设置第二组uv下面代码中有体现。

.aoMapIntensity : Float

环境遮挡效果的强度。默认值为1。零是不遮挡效果。

(4)此时的呈像给人还是二维的感觉,使用.displacementMap属性,添加位移贴图达到三位的校效果。

.displacementMap : Texture

位移贴图会影响网格顶点的位置,与仅影响材质的光照和阴影的其他贴图不同,移位的顶点可以投射阴影,阻挡其他对象, 以及充当真实的几何体。位移纹理是指:网格的所有顶点被映射为图像中每个像素的值(白色是最高的),并且被重定位。

.displacementScale : Float

位移贴图对网格的影响程度(黑色是无位移,白色是最大位移)。如果没有设置位移贴图,则不会应用此值。默认值为1。

注:应当设立立方体的段数.***Segments(设置长/宽/高应该划分为几段,默认为1),此处设置为了增加顶点的个数,因为位移贴图是通过影响网格顶点的位置来实现的,段数越多模型越精细。

(5)此处已经使用了四张贴图。我们看后面的贴图的使用。

为了让门的金属部分效果更逼真,.metalnessMap设置金属贴图(图片中越倾向白色越靠近金属)

.metalness : Float

材质与金属的相似度。非金属材质,如木材或石材,使用0.0,金属使用1.0,通常没有中间值。 默认值为0.0。0.0到1.0之间的值可用于生锈金属的外观。如果还提供了metalnessMap,则两个值相乘。

.metalnessMap : Texture

该纹理的蓝色通道用于改变材质的金属度。

(6)为了让门更加贴切与生活。可以添加roughnessMap属性,导入粗糙度贴图,设置粗糙度(黑色粗糙,白色光滑)

.roughness : Float

材质的粗糙程度。0.0表示平滑的镜面反射,1.0表示完全漫反射。默认值为1.0。如果还提供roughnessMap,则两个值相乘。

.roughnessMap : Texture

该纹理的绿色通道用于改变材质的粗糙度。

(7)因为日常光照下,门的面是漫反射反光强度不同,所以最后在添加一个法线贴图拉。

.normalMap : Texture

用于创建法线贴图的纹理。RGB值会影响每个像素片段的曲面法线,并更改颜色照亮的方式。法线贴图不会改变曲面的实际形状,只会改变光照。

现在这个门的模型就创建完成了。贴图放在了代码后面。需要的朋友可以自己粘贴。

    import * as THREE from "three";import {Clock, TextureLoader, WebGLRenderer} from "three";import {fromHalfFloat} from "three/src/extras/DataUtils";// 导入轨道控制器import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";// 1. 创建场景const scene = new THREE.Scene();// 2. 创建相机const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);camera.position.set(0,0,10);scene.add(camera);const loader = new TextureLoader();const load1 = loader.load("./textures/door/color.jpg");const load2 = loader.load("./textures/door/ambientOcclusion.jpg");const load3 = loader.load("./textures/door/alpha.jpg");// 导入金属贴图const metalnessTexture = loader.load("./textures/door/metalness.jpg");// 导入粗糙度贴图const roughnessTexture = loader.load("./textures/door/roughness.jpg");//导入置换贴图  作位移使用const doorHeightTexture = loader.load("./textures/door/height.jpg");// 导入法线贴图const normalTexture = loader.load("./textures/door/normal.jpg");// 添加我物体创建物体let geometry = new THREE.BoxGeometry(2,2,2,100,100,100);let material = new THREE.MeshStandardMaterial({color : 0xffff00,map : load1,            // 颜色贴图aoMapIntensity :0.7,alphaMap : load3,      // alpha贴图是一张灰度纹理,用于控制整个表面的不透明度transparent :true,aoMap : load2,   // 该纹理的红色通道用作环境遮挡贴图。默认值为null。aoMap需要第二组UVside : THREE.DoubleSide,metalness: 1,metalnessMap: metalnessTexture,roughness: 1,roughnessMap: roughnessTexture,              // 黑色粗糙,白色光滑displacementMap: doorHeightTexture,displacementScale: 0.1,normalMap: normalTexture,});let mesh = new THREE.Mesh(geometry,material);scene.add(mesh);/** 设置第二组uv */geometry.setAttribute("uv2",new THREE.BufferAttribute(geometry.attributes.uv.array,2));// 灯光// 环境光const light = new THREE.AmbientLight(0xffffff, 0.5); // soft white lightscene.add(light);//直线光源const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);directionalLight.position.set(10, 10, 10);scene.add(directionalLight);// 初始化渲染器var renderer = new WebGLRenderer();renderer.setSize(window.innerWidth,window.innerHeight);// 将webgl渲染的canvas 内容添加进入 bodydocument.body.appendChild(renderer.domElement);// 创建轨道控制器const controls = new OrbitControls(camera,renderer.domElement);controls.enableDamping = true;   // 设置阻尼var helper = new THREE.AxesHelper(5);scene.add(helper);function render(){controls.update();renderer.render(scene,camera);// 渲染下一帧就会调用render 函数requestAnimationFrame(render);  // 请求动画帧}render();// 监听页面变化,更新渲染画面window.addEventListener("resize",()=>{// 1. 更新摄像头camera.aspect = window.innerWidth / window.innerHeight;// 2. 更新摄像机的投影矩阵camera.updateProjectionMatrix();// 3. 更新渲染器renderer.setSize(window.innerWidth,window.innerHeight);// 4. 更新渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio);})window.addEventListener("dblclick",()=>{const fullScreenElement = document.fullscreenElement;  // 是否全屏if (!fullScreenElement) {renderer.domElement.requestFullscreen();} else {document.exitFullscreen();}});

alpha

ambientOcclusion

color

normal

height

metalness

roughness

Threejs贴图为了更好的渲染(门)相关推荐

  1. CVPR2021(Oral) 商汤、港中文实现单目人脸重建新突破: 基于生成网络的渲染器!几何形状更精准!渲染效果更真实!...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 近日,商汤-港中文联合实验室提出基于风格化对抗生成器的人脸渲染器,用于取代传统图形学基于栅格化的渲染器 ...

  2. CVPR2021(Oral) 商汤、港中文实现单目人脸重建新突破: 基于生成网络的渲染器!几何形状更精准!渲染效果更真实!

    近日,商汤-港中文联合实验室提出基于风格化对抗生成器的人脸渲染器,用于取代传统图形学基于栅格化的渲染器来进行3D模型的重建.该方法构建了一种从输入3D模型到生成图像的平滑梯度,同时可以以低精度建模获得 ...

  3. 大量贴图采样限制下的渲染处理方法

    因为项目中有换装系统,换装系统中有大量的可替换的脸部数据,比如眉毛,睫毛,腮红,眼影,口红等,需要十多个贴图通道.所以我们的shader中需要有十多张贴图通道 跑再android机器上时,一切都正常显 ...

  4. 如何更快地渲染?深入了解3D渲染性能的指南!(5)

    上文<如何更快地渲染?深入了解3D渲染性能的指南!(4)>我们介绍了从场景内部灯光.用料.反射.材质等方面的优化,提升场景渲染的速度.本文Renderbus云渲染农场将继续从渲染设置.全局 ...

  5. 如何更快地渲染?深入了解3D渲染性能的指南!(4)

    上文<如何更快地渲染?深入了解3D渲染性能的指南!(3)>中,我们介绍了如何快速渲染中对场景中多边形数量的优化,从而加速场景的渲染速度.本文Renderbus云渲染农场将继续带您从场景内部 ...

  6. 华为手表哪款搭载鸿蒙系统,[图]华为Watch GT 2渲染图曝光:首款搭载鸿蒙系统的智能手表...

    原标题:[图]华为Watch GT 2渲染图曝光:首款搭载鸿蒙系统的智能手表 近日华为官宣将于9月19日在德国慕尼黑召开新品发布会,正式推出备受关注的新款旗舰Mate 30系列.与此同时华为还将会推出 ...

  7. vue和layui哪个更好用_幕布和Mind+思维导图哪个更好用?

    我用的是幕布和mindmaster 幕布适合移动端,ipad手机都很方便使用编辑文档然后直接生成思维导图,但是生成之后的思维导图不能调整,只能通过该文档调整,文档是目录式的,可以插图,可以添加注释,可 ...

  8. 那些漂亮有创意的思维导图真的更吸引人吗?

    追求美是人类与生俱来的天性,在这个世界,有时候不得不承认颜值高的人总会受到更多人的关注,获得更多的机会,得到更多的照顾.美的事物会让我们内心觉得舒服,会在我们的记忆中停留更长的时间,从人到小动物,从风 ...

  9. ThreeJS 骨架图显示、骨骼修改颜色

    ThreeJS 骨架图显示.骨骼修改颜色 郭隆邦_技术博客 http://www.yanhuangxueyuan.com http://www.yanhuangxueyuan.com/Three.js ...

最新文章

  1. SSH框架的简单搭建步骤
  2. caffe中solver.prototxt文件参数解释
  3. controller层没反应_埋地管道防腐层探测检漏仪FJ-10地下管线探测仪的说明及应用...
  4. MVC Html.AntiForgeryToken() 防止CSRF攻击
  5. (优秀文章保存)Quartz优秀文章保存
  6. 超级计算机清华,从清华到华科 名校为何主办超级计算机大赛?
  7. python aes padding_使用PKCS7Padding在python和Node.js之间进行AES加密
  8. 类与对象 格式小结 java 1202
  9. Java的位运算符——与()、非(~)、或(|)、异或(^)
  10. Netty工作笔记0065---WebSocket长连接开发4
  11. primefaces教程_Primefaces仪表板组件示例教程
  12. [经验]自定义ASP.NET服务器控件属性的状态不能保存的问题
  13. 邮件服务器怎么填写,邮箱可以绑定哪些客户端?
  14. MacOS Aria2GUI配置
  15. spring.factory
  16. 射击比赛的成绩 华为od js
  17. 御坂坂的C++学习之路(1)
  18. python小游戏之外星人入侵之pygame实战应用(含源码下载)
  19. Python中的sin和cos函数
  20. 梯形断面临界水深莫洛图

热门文章

  1. 利用ADB 协议建立PC与手机端本地unix套接字的连接
  2. 【PHP】高端响应式自适应房屋出售建筑设计企业织梦模板
  3. H5+css : 360商城的首页布局模拟
  4. 《机械制造业智能工厂规划设计》——2.3 智能工厂的方针、目标
  5. unity 快捷键之summary
  6. Basler pylon-ros-camera驱动 Xavier AGX调试记录 (Arm架构)
  7. 云南大学计算机网络期中考试刘春花,2008年云南大学软件学院计算机网络期中考试试题...
  8. vr技术与图书馆的结合,碰撞出什么火花呢
  9. Qt的源码编译及QtE编译记录
  10. 航顺 HK32F030C8T6 单片机MCU控制器