Threejs贴图为了更好的渲染(门)
![](/assets/blank.gif)
门模型使用标准网格材质(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();}});
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
Threejs贴图为了更好的渲染(门)相关推荐
- CVPR2021(Oral) 商汤、港中文实现单目人脸重建新突破: 基于生成网络的渲染器!几何形状更精准!渲染效果更真实!...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 近日,商汤-港中文联合实验室提出基于风格化对抗生成器的人脸渲染器,用于取代传统图形学基于栅格化的渲染器 ...
- CVPR2021(Oral) 商汤、港中文实现单目人脸重建新突破: 基于生成网络的渲染器!几何形状更精准!渲染效果更真实!
近日,商汤-港中文联合实验室提出基于风格化对抗生成器的人脸渲染器,用于取代传统图形学基于栅格化的渲染器来进行3D模型的重建.该方法构建了一种从输入3D模型到生成图像的平滑梯度,同时可以以低精度建模获得 ...
- 大量贴图采样限制下的渲染处理方法
因为项目中有换装系统,换装系统中有大量的可替换的脸部数据,比如眉毛,睫毛,腮红,眼影,口红等,需要十多个贴图通道.所以我们的shader中需要有十多张贴图通道 跑再android机器上时,一切都正常显 ...
- 如何更快地渲染?深入了解3D渲染性能的指南!(5)
上文<如何更快地渲染?深入了解3D渲染性能的指南!(4)>我们介绍了从场景内部灯光.用料.反射.材质等方面的优化,提升场景渲染的速度.本文Renderbus云渲染农场将继续从渲染设置.全局 ...
- 如何更快地渲染?深入了解3D渲染性能的指南!(4)
上文<如何更快地渲染?深入了解3D渲染性能的指南!(3)>中,我们介绍了如何快速渲染中对场景中多边形数量的优化,从而加速场景的渲染速度.本文Renderbus云渲染农场将继续带您从场景内部 ...
- 华为手表哪款搭载鸿蒙系统,[图]华为Watch GT 2渲染图曝光:首款搭载鸿蒙系统的智能手表...
原标题:[图]华为Watch GT 2渲染图曝光:首款搭载鸿蒙系统的智能手表 近日华为官宣将于9月19日在德国慕尼黑召开新品发布会,正式推出备受关注的新款旗舰Mate 30系列.与此同时华为还将会推出 ...
- vue和layui哪个更好用_幕布和Mind+思维导图哪个更好用?
我用的是幕布和mindmaster 幕布适合移动端,ipad手机都很方便使用编辑文档然后直接生成思维导图,但是生成之后的思维导图不能调整,只能通过该文档调整,文档是目录式的,可以插图,可以添加注释,可 ...
- 那些漂亮有创意的思维导图真的更吸引人吗?
追求美是人类与生俱来的天性,在这个世界,有时候不得不承认颜值高的人总会受到更多人的关注,获得更多的机会,得到更多的照顾.美的事物会让我们内心觉得舒服,会在我们的记忆中停留更长的时间,从人到小动物,从风 ...
- ThreeJS 骨架图显示、骨骼修改颜色
ThreeJS 骨架图显示.骨骼修改颜色 郭隆邦_技术博客 http://www.yanhuangxueyuan.com http://www.yanhuangxueyuan.com/Three.js ...
最新文章
- SSH框架的简单搭建步骤
- caffe中solver.prototxt文件参数解释
- controller层没反应_埋地管道防腐层探测检漏仪FJ-10地下管线探测仪的说明及应用...
- MVC Html.AntiForgeryToken() 防止CSRF攻击
- (优秀文章保存)Quartz优秀文章保存
- 超级计算机清华,从清华到华科 名校为何主办超级计算机大赛?
- python aes padding_使用PKCS7Padding在python和Node.js之间进行AES加密
- 类与对象 格式小结 java 1202
- Java的位运算符——与()、非(~)、或(|)、异或(^)
- Netty工作笔记0065---WebSocket长连接开发4
- primefaces教程_Primefaces仪表板组件示例教程
- [经验]自定义ASP.NET服务器控件属性的状态不能保存的问题
- 邮件服务器怎么填写,邮箱可以绑定哪些客户端?
- MacOS Aria2GUI配置
- spring.factory
- 射击比赛的成绩 华为od js
- 御坂坂的C++学习之路(1)
- python小游戏之外星人入侵之pygame实战应用(含源码下载)
- Python中的sin和cos函数
- 梯形断面临界水深莫洛图
热门文章
- 利用ADB 协议建立PC与手机端本地unix套接字的连接
- 【PHP】高端响应式自适应房屋出售建筑设计企业织梦模板
- H5+css : 360商城的首页布局模拟
- 《机械制造业智能工厂规划设计》——2.3 智能工厂的方针、目标
- unity 快捷键之summary
- Basler pylon-ros-camera驱动 Xavier AGX调试记录 (Arm架构)
- 云南大学计算机网络期中考试刘春花,2008年云南大学软件学院计算机网络期中考试试题...
- vr技术与图书馆的结合,碰撞出什么火花呢
- Qt的源码编译及QtE编译记录
- 航顺 HK32F030C8T6 单片机MCU控制器