使用SVG做模型贴图的思路

比特筑梦
• 阅读 1981

大多数情况下,三维模型使用PNG,JPG作为模型的贴图,当然为了性能优化,有时候也会使用压缩贴图来提高渲染效率和较少GPU压力。

今天提供一种新的思路,使用SVG作为模型的贴图,可以达到动态调整图片精度的效果。

使用svg作为贴图的思路,有两种。

直接作为贴图

直接使用贴图,其实和png jpeg的图片没有多少差别,加载的贴图效果,最终也会比 较模糊。 大致代码如下:

           var cube2 = new mono.Cube(105 * 10,1094 * 10,1);
           cube2.setStyle('m.color','orange');
           cube2.setStyle('front.m.texture.image','front01.svg');
           cube2.p(-1000,0,0)
           box.add(cube2);

最终效果如下图左边对象所示:

使用SVG做模型贴图的思路

通过canvas 动态生成贴图

从上面我们可以看出,直接使用svg作为贴图资源,效果是位图没太大区别,而svg的矢量图放大不失真的优势也失去了。
其实还有另外一种方式,就是使用canvas绘制svg,同时可以动态的调整绘制时候的缩放比例。 由于svg在缩放的时候不会失真,因此可以得到较大尺寸而且又高清的图片。
代码如下所示:

let image = new Image();
            
            image.onload = function() {
                console.log(image.width,image.height)

                let can = document.createElement('canvas');
                let scale = 10;
                can.width = image.width * scale;
                can.height = image.height * scale;
                let ctx = can.getContext('2d');
                ctx.drawImage(image,0,0,can.width,can.height);

                var cube = new mono.Cube(can.width,can.height,1);
                cube.setStyle('m.color','orange');
                cube.setStyle('front.m.texture.image',can.toDataURL());
                box.add(cube);
            }

            image.src = 'front01.svg';

上面的先使用image对象加载svg图片,然后把svg图片绘制到canvas上面,注意绘制的时候放大的倍数是10. (let scale = 10)。
最后得到的效果如下图右边对象所示:

使用SVG做模型贴图的思路

可以看到达到了高清的效果。

拓展思路

  1. 可以根据镜头距离动态改变绘制的scale级别,达到lod的目的。
  2. svg 图片本身还支持动态修改属性,比如灯的颜色等,可以达到监控状态的改变的目的。

拓展思路,如果读者有兴趣,可以点赞,后续接着写。

总结

使用svg 图片,可以不用做高清的位图,结合canvas绘制,也可以得到高清的纹理贴图效果。

如果对可视化感兴趣,可以和我交流,微信541002349。 关注公号“ITMan彪叔” 可以及时收到更多有价值的文章。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
three.js 显示三维模型(贴图)
<!DOCTYPEhtml<htmllang"en"   <head      <titleid"h2"</title      <metacharset"utf8"      <metaname"viewport"content"widthdevicewidth,user
Wesley13 Wesley13
3年前
UNITY崩坏3角色渲染实践
最近二次元手游,卡通渲染都挺火的。虽然公司没开这类型项目,但是渲染来玩一下也好,原理都是一样,比较简单。在日式卡通中,《罪恶装备》、《崩坏3》的效果都很不错,都是几年前的产品,两者的渲染方式是类似的。这里用的是《崩坏3》的手游模型,仅是学习,侵权必删。shader贴图崩坏3主要用到两张贴图:albedotexilmtex,其中ilmtex,
Wesley13 Wesley13
3年前
Unity渲染教程的GAD中文翻译版本地址。
Unity渲染教程(一):矩阵:http://gad.qq.com/program/translateview/7181958Unity渲染教程(二):着色器基础:http://gad.qq.com/program/translateview/7173930Unity渲染教程(三):使用多张纹理贴图:http://g
Wesley13 Wesley13
3年前
Unity3D学习笔记(十二):2D模式和异步资源加载
2D模式和3D模式区别:背景纯色,摄像机2D,没有深度轴精灵图片设置!(https://oscimg.oschina.net/oscnet/635b7ea2aded8aa3030310e896af36d127f.png)Normalmap,法线贴图,更有立体感Sprite(2DandUI),2D精灵贴图,有两种用途1、当做UI
Easter79 Easter79
3年前
Three.js 地理坐标和三维空间坐标的转换
奇技指南本文作者高峰,360奇舞团前端工程师,W3C性能工作组/WOT工作组成员本文转载自奇舞周刊引言在实现3D地球时,球面是通过地理贴图渲染的。所以我们所说的地理坐标和三维空间坐标的转换,是指将地理贴图上的坐标,转换为球面坐标(https://en.wikipedia.org/wiki/Spherical\_coor
Wesley13 Wesley13
3年前
Unity3D研究院之3种方式播放游戏视频
Unity3D中播放游戏视频的方式有3种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上。第二种是在GUI层面上播放视频。播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类,第三种在手机上播放Handheld.PlayFullScreenMovie。那么本章我们
Stella981 Stella981
3年前
Activity猫的一生
大家好,关于Android中Activity的生命周期,网上大多数文章基本都是直接贴图、翻译API,比较笼统含糊不清。!(https://static.oschina.net/uploads/img/201703/28130413_Fi8i.png)我就用故事来说一说:有个人叫User,TA养了几只猫,有只猫叫Activity。Use
Wesley13 Wesley13
3年前
Unity展厅模型预处理UV拆分光影烘焙材质后处理特效制作流程【2020】
  应很多读者的要求,本文小姐姐将以一个用户的展厅VR场景为例,详细讲解Unity3d的VR开发在美工阶段的模型预处理、UV2拆分、贴图优化、光影烘焙、后处理与特效制作以及最终作品优化的基本方法和流程,其中涉及BuildinRP(BuildinRenderingPipeline内置渲染管道)、URP(UniversalRenderingPip
Wesley13 Wesley13
3年前
Unity使用脚本进行批量动态加载贴图
先描述一下我正在做的这个项目,是跑酷类音游。那么跑酷类音游在绘制跑道上的时候,就要考虑不同的砖块显示问题。假设我有了一个节奏列表,那么我们怎么将不同的贴图贴到不同的砖块上去呢?我花了好几个小时才搞清楚里面的门路,且听我慢慢道来。首先我们建立一个地图,在上面新建一个EmptyObject,将所有的Road砖块全部划分到这个分组里。!(ht
Wesley13 Wesley13
3年前
D3D资源管理
摘要受管贴图(Managedtextures,也就是我们通常所谓的“自动管理贴图”),在DX6中首次被引入,经过一系列的改进和增强,在DX9中自动管理的资源类型增加到贴图,顶点缓冲,顶点索引缓冲,所有这些资源使用统一的公共接口。通过使用D3D资源管理器,应用程序可以轻松的处理设备丢失、处理稍微过量的显存使用。有时开发者在使用受管资源
Wesley13 Wesley13
3年前
Unity项目中的资源管理
这是我在2017金山技术开放日分享的部分内容。从贴图资源格式配置的介绍开始,引申出资源配置工具,最后再谈谈一整套项目资源管理方案。在GitHub上可以获取到资源配置工具的代码,是基于下面理念的一份简单实现。一个3D游戏项目中的资源主要由贴图、模型、动作、声音等组成。模型设计师设计模型,场景由模型组成,角色不仅是一个精致的模型还带了各类的动作,包括走路、跑
比特筑梦
比特筑梦
Lv1
路是一直都在的,是你会不会选择而已。
文章
5
粉丝
0
获赞
0