ainatipen 发表于 2022-11-28 17:40

Unity规范:图片的分辨率

如果素材是3D模型:


[*]首先确定素材在unity场景中的大小,单位为unit(如果你制作物理风格的游戏,那么一般默认1 unit=1 meter)
[*]然后确定这个素材离camera最近的时候,它在你的目标设备上占据多少像素,单位为pixel
[*]由此计算出合理的TD值,美术人员制作符合TD值的纹理贴图(在展UV的阶段调整TD值)


<hr/>Texel Density

学习链接:https://www.bilibili.com/read/cv7651034/
原文购买链接:https://www.artstation.com/marketplace/p/JWwlB/texel-density-all-you-need-to-know-hq-pdf
前言:
一个流程规范的项目制作,会规定统一的Texel Density,以避免美术人员制作出过度细节的贴图,而和环境中其他资产的质量不协调。


概念解释:
pixel像素,组成屏幕的最小单位texel (pixel of texture)纹理元素,组成纹理的最小单位Texel Density(TD)纹素密度,网格上纹理分辨率的密度纹素密度 TD= sqrt(uv块面积/对应的网格面积)


如何选择合适的TD值?
一个屏幕像素可以由多个texel来确定(texel被压缩);
一个texel可以覆盖多个屏幕像素(texel被拉伸);
理想是,texel和像素1:1
首先确定游戏中相机的视角:假设游戏中一个1立方米的方块在距离你最近时,…因此,你可以把场景中的素材分为:第一人称相机(FPS):
你与可交互物体距离很近它在你的显示器上占据1000px,
那么理想TD=1024px÷1m=1024px/m前景:与你距离很近的可交互物体第三人称相机(TPS):
你与环境保持一定距离它在你的显示器上占据500px,
那么理想TD=512px÷1m=512px/m中景:与你保持一定距离的中景素材战略游戏相机(Strategy):
你与环境相距很远它在你的显示器上占据100px,
那么理想TD=128px÷1m=128px/m远景:与你相距很远的背景素材 理想情况是,可交互物体只出现在前景,中景素材只出现在中景区域,背景素材只出现在远景区域

[*]如果可交互物体出现在中景、远景区域,会造成性能消耗,也会产生“分辨率过旺”的不和谐感——因此可使用Mipmaps
[*]应避免中景素材出现在前景区域,避免背景素材出现在中景、前景区域,它们的低分辨率会辣眼睛
应用实践:
美术人员如何制作符合TD值的纹理贴图?
Blender:插件ZenUV可以根据纹理密度缩放UV
而对于可平铺的纹理贴图:你要根据TD值和模型尺寸来决定纹理的平铺值



128px的贴图在1米上拼接4张才符合512 px/m的TD值要求,而模型总共4m长,所以需要16张贴图平铺

<hr/>如果素材是sprite类型:


[*]确定这个素材离camera最近的时候,它在你的目标设备上占据多少像素,单位为pixel;
[*]素材文件的最佳分辨率,即素材最终在屏幕上占据的像素值;
*对于ScreenSpace的UI,很容易确定它的最佳分辨率;对于WorldSpace的UI,我们没必要追求最佳分辨率,只要在正常距离下看起来不模糊(或者模糊程度在可接受范围内)即可

pixel per unit (PPU)


[*]unity导入一张图片,将图片类型设为Sprite,(点击SpriteEditor可对其切割九宫格)
——发现图片导入设置中有【Pixels Per Unit】
[*]在场景中新建一个Image,默认宽100高100比例1
——发现Canvas设置中有【Reference Pixels Per Unit】
——发现Image设置中有【Pixels Per Unit Multiplier】
先上结论:
图片最终的 PPU =【Pixels Per Unit】×【Pixels Per Unit Multiplier】÷【Reference Pixels Per Unit】
<hr/>什么是unit:Unity使用“unit”作为长度单位,1 unit可以是任意的,根据你的需求自定义

[*]如果你制作Tile based games(棋盘格游戏),那么1 Unit = 1 Tile (eg. if a tile is 64 pixel large, then 64 would be the Pixels per Unit)
[*]如果你制作像素游戏,那么1 Unit = 1 Pixel
[*]如果你制作物理风格的游戏,那么1 unit=1 meter。如果人物角色身高 2 units,人物角色的图片分辨率1000×1000,那么 Pixels per Unit=1000/2=500
假设一张图片分辨率为1000×1000,把它放进场景中,scale默认为1

[*]如果你希望它在scale=1的时候大小为2个unit,那么你需要设定它的PPU = 1000÷2=500
[*]如果你希望它在scale=2的时候大小为2个unit,那么你需要设定它的PPU = 1000÷1=1000
——图片的PPU值,用于定义图片在unity场景中的单位尺寸,即在scale=1时图片大小为多少unit
因此你需要先确定图片在场景中的尺寸(多少unit),然后再根据图片的分辨率计算出PPU值。
比如,你为一张“树”的Image预设了【Width=2,Height=2】(scale=1),树的图片分辨率500×1000,那么可计算得它的 Pixels per Unit = 500÷2 = 250
然而,对于有些图片,我们不能预设它在场景中的尺寸,比如下面这张使用了九宫格切割的图片——它的四个角块在Image缩放时将保持不变,只有中央区域会响应缩放——它可以自由拉伸宽度和高度,同时保持四个角块不变,常用于制作背景板、坐标轴





[*]由于蓝色区域是可被缩放的,假设蓝色区域被压缩至零,那么这张箭头图片就剩下四个角块,即它的最小分辨率是728×630,这意味着【Pixels Per Unit】也存在一个最小值。
[*]我们这个例子里,默认图片的尺寸为2 units,所以728×630除以2就是364×315,取较小值,即315是【Pixels Per Unit】的最小值,此时图案呈现的是只剩下四个角块的样子。
[*]设置【Pixels Per Unit】小于315是没有意义的,因为蓝色区域已经被压缩至零,图案不可能更小了。严格的说,应该是【Pixels Per Unit】与【Pixels Per Unit Multiplier】的乘积再除以【Reference Pixels Per Unit】后的值如果小于315,是没有意义的。
请具体解释一下什么叫“没有意义”:
①小于315的值对应的图案,都和值等于315时的图案一样,即只剩四个角块的样子
②如果这个值小于315很多,意味着你需要很大的【Width,Height】才能看到九宫格图案的缩放效果
我们可以根据角块的pixel和unit去计算PPU,但是这样太麻烦了,只要图片能正常显示,PPU并不需要是一个精确计算的结果——当你无法在你预设的【Width,Height】附近呈现正确的九宫格图片时,原因是PPU值偏小,你可以尝试调整【Pixels Per Unit】【Pixels Per Unit Multiplier】【Reference Pixels Per Unit】这3个参数,使它变大
附:2D游戏中的分辨率设置

学习链接: https://blogs.unity3d.com/cn/2018/11/19/choosing-the-resolution-of-your-2d-art-assets/


使用2D摄像机(正交投影Orthographic)会看见一个【Size】属性,这个值乘2,就是摄像机画面在纵轴方向上的长度,单位unit。如果Size=5,即画面纵轴有10个单位长,横轴长度则根据硬件设备的分辨率计算。


如果你的目标设备是1080P的分辨率:

[*]如果画面纵轴等于10units,那么1 unit=屏幕上108pixels,也就是说图片素材的PPU应该≥108,不然图片会看起来模糊。
[*]如果图片素材的PPU设置为100不改变,那么增加camera的Size,使得画面纵轴等于10.8units同样可以避免图片模糊。

[*]所有的图片资产使用一个统一的PPU值
[*]使用一个固定的camera size
[*]根据实际情况可打破1、2

KaaPexei 发表于 2022-11-28 17:46

没听懂呀,唉

xiaozongpeng 发表于 2022-11-28 17:49

既然可以使用长宽修改图片大小。那么缩放功能是做什么的呢?这里没有理解。

LiteralliJeff 发表于 2022-11-28 17:50

我重写了
页: [1]
查看完整版本: Unity规范:图片的分辨率