Unity Shader - Smoothness 平滑度

本文深入探讨Unity Shader中Smoothness参数的作用与应用,解释其如何影响材质表面的微表面细节和平滑度,以及如何通过纹理映射精细控制材质的高光反射效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:Smoothness
版本:2019.1

Smoothness

The smoothness parameter, shown in both Metallic & Specular shader modes.
Smoothness平滑度参数,都显示在Metallic和Specular来种Shader模式中。

在Specular和Metallic两个Shader工作流中的Smoothness概念都非常的相似。默认的都没有设置MetallicSpecular纹理参数,材质中的smoothness是由一个滑动器来控制。这允许你控制一个表面的"microsurface detail"(微表面细节)或是表面的平滑度。

在上面显示的两种Shader工作流中,不论你选择的是Metallic纹理参数或是Specular的纹理参数,smoothness参数值都可以使用两种工作流其中。下面将进一步解析。
A range of smoothness values from 0 to 1
smoothness参数范围从0.0~1.0

“microsurface detail”(微表面细节)是不能直接在Unity中显示的。这是光照计算的中的一些概念。微表面细节的效果是对象呈现出许多光照效果的漫反射的光反弹的效果。一个平滑的表面,所有光线的反射角度都是可预测的。极端都说,一个完美的平滑表面的光反射效果就像镜子一样。越不平滑的表面光反射的角度就比较飞散(就像光线照射到了一个凹凸不平的微便面),因此表面反射细节就越少就像漫反射。
A comparison of low, medium and high values for smoothness (left to right), as a diagram of the theoretical microsurface detail of a material. The yellow lines represent light rays hitting the surface and reflecting off the angles encountered at varying levels of smoothness.
比较一下这些光滑度分别从底,中,高(从左到右),就像材质中的微表面的原理图解。黄线代表光照射到表面并反弹,根据不同平滑度,反弹角度也会有所不同。

一个平滑的表面带有的微表面细节是很少的,或根本没有(肉眼看似没有,但微观世界是都没有完全平滑的表面,都是由一粒粒更微小粒子排列组合成的,这里我就不纠结了),所以光线反弹都比较统一的方向,反射出来的效果就很清晰。而一个粗糙的表面,在微表面看似有高高低低的细节,因此光反射角度就比较多(因为表面高高低低的,很多有角度,反射出来的角度当然就不统一了,所以看起来光都散射在各个角度中),都平均的往各个方向射出,呈现出一个漫反射似的,不清晰的反射效果。
A comparison of low, medium and high values for smoothness (top to bottom).
比较低,中,到平滑值得效果(从上往下)。

在低平滑度中,表面上每个点都有不一样的角度去反射,因为微表面都是凹凸不平,导致散射光线。在搞平滑度中,每个点都比较统一方向反弹光,所以物体表面上将得到比较清晰的环境反射。

Using a Smoothness Texture Map

使用Smoothness纹理映射

同样的,其他很多参数,都可以用一张纹理映射来替代一个滑动器值。这将允许你很好的控制材质每个表面上的高光反射的强度和色调。

使用一张纹理而不是一个滑动器值,意味着你可以创建出每个表面都都不一样的smoothness平滑度的材质(通常与根据Albedo纹路中的内容来定smoothness的纹理,其实还有很多的法线,凹凸,高光,等,都是与Albedo的纹理内容匹配上的)。

Properpty(属性)Function(功能)
Main Maps Smoothness source选择Smoothness数值所存在的纹理通道
Specular/Metallic Alpha因为每个像素点上的表面smoothness平画质只是一个数值而定,仅仅需要纹理单通道数值来存储。因此smoothness数据假设存储在纹理Metallic或Specular纹理映射中(依赖你选择的是Metallic还是Specular的模式Shader工作流)。
Albedo Alpha这可以让你减少纹理的数量,直接用Albedo的Alpha通道来存储Smoothness在Specular/Metallic两模式Shader工作流都可使用。
Forward Rendering Options Highlights在移动设备上运行的话,把这个选项禁用(不选,不勾上),可以优化性能。这将删除了Standard Shader中的highlights(高光)的计算。最终效果主要依赖于Specular/Metallic中的Smoothness值。
Forward Rendering Options Reflections在移动设备上禁用该选择可优化性能。这将删除Standard Shader中的反射效果。或是使用环境映射贴图(可以是Cube Map,不知道有没Sphere Map)采样的方式来模拟。外观效果依赖于smoothness数值。

越是平滑的表面反射效果越强,反射高光更强。反之,越不平滑的表面反射效果,反射高光就越不明显,因为表面的反射都散射在各个角度上(散射,类似漫反射)。使用与Albedo纹理贴图对应的Specular和Smoothness纹理贴图,你将可创建非常逼真的效果。

<think>好的,用户想在Unity中使用Shader绘制圆形。首先,我需要回忆一下如何在Shader中绘制基本形状。通常,绘制几何形状可以通过计算像素到中心的距离来实现。对于圆形,可以使用距离公式,然后根据半径判断是否在圆内。 接下来,我应该考虑Unity Shader的结构。用户可能需要一个表面着色器或者片元着色器。考虑到简单性,片元着色器可能更合适,因为它可以直接控制每个像素的颜色。需要定义属性,比如颜色、半径、中心位置等,这些可以通过Properties块暴露给材质面板。 然后,顶点着色器需要将顶点位置转换到裁剪空间,并传递UV坐标。UV坐标通常是从0到1的,所以可能需要调整坐标系统,让中心在(0.5,0.5)的位置,这样更容易绘制居中圆形。 在片元着色器中,计算当前UV点到中心的距离。使用step或者smoothstep函数来创建硬边或柔和的边缘。用户可能想要一个可调整的半径和边缘平滑参数,所以需要添加对应的变量。 此外,用户可能需要示例代码来参考。代码应该包括属性声明、顶点和片元函数,以及距离计算部分。同时,需要解释关键代码行,比如如何计算距离,如何使用step函数,以及如何混合颜色。 还需要考虑可能的优化和扩展,比如抗锯齿处理,或者让圆形动态变化。引用中的Sample Gradient节点可能不直接相关,但光照部分的知识可能帮助用户理解Shader的其他应用。同时,引用[3]中的lerp函数使用可以用来混合颜色,这可能对用户有帮助。 最后,生成相关问题,帮助用户深入理解,比如如何添加动画、抗锯齿技术,或者在3D物体上绘制圆形。这些扩展问题能引导用户进一步探索Shader的功能。</think>### 在 Unity 中使用 Shader 绘制圆形的实现方法 #### 1. 核心原理 通过 Shader 的片元着色器(Fragment Shader)计算像素点到圆心的距离,并用阈值判断是否属于圆形区域。数学表达式为: $$ d = \sqrt{(uv.x - center.x)^2 + (uv.y - center.y)^2} $$ 当 $d \leq radius$ 时,像素属于圆形区域[^3]。 #### 2. 完整 Shader 代码示例 ```glsl Shader "Custom/DrawCircle" { Properties { _Color ("Circle Color", Color) = (1,1,1,1) _Radius ("Radius", Range(0,0.5)) = 0.2 _Center ("Center", Vector) = (0.5,0.5,0,0) _Smoothness ("Edge Smoothness", Range(0,0.1)) = 0.01 } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; // UV坐标自动在0-1范围 return o; } fixed4 _Color; float _Radius; float2 _Center; float _Smoothness; fixed4 frag (v2f i) : SV_Target { // 计算到圆心的距离 float distance = length(i.uv - _Center); // 使用smoothstep实现平滑边缘 float circle = smoothstep(_Radius + _Smoothness, _Radius - _Smoothness, distance); return _Color * circle; } ENDCG } } } ``` #### 3. 关键代码解析 1. **UV坐标系**: - 默认UV坐标系范围是 $(0,0)$ 到 $(1,1)$ - 设置 `_Center = (0.5,0.5)` 可使圆心居中 2. **距离计算**: ```glsl float distance = length(i.uv - _Center); // 计算欧几里得距离 ``` 3. **边缘平滑**: ```glsl smoothstep(_Radius + _Smoothness, _Radius - _Smoothness, distance); ``` 当距离处于 $[radius - smoothness, radius + smoothness]$ 区间时,产生渐变效果[^2] #### 4. 使用方法 1. 创建新材质并选择此 Shader 2. 调整参数: - `_Radius`:控制圆的大小 - `_Center`:调整圆心位置 - `_Smoothness`:设置边缘模糊 3. 将材质应用到Quad等平面物体 #### 5. 效果优化建议 - 添加 `[PerRendererData]` 标签实现动态参数修改 - 结合深测试实现3D物体表面绘制 - 使用 `step()` 替代 `smoothstep()` 可获得硬边效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值