Unity3D Shader 入门

转载注明出处:点击打开链接

 

Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shader并不是一个统一的标准,不同的图形接口的Shader并不相同。OpenGL的着色语言是GLSL, NVidia开发了Cg,而微软的Direct3D使用高级着色器语言(HLSL)。而Unity的Shader 是将传统的图形接口的Shader(由 Cg / HLSL编写)嵌入到独有的描述性结构中而形成的一种代码生成框架,最终会自动生成各硬件平台自己的Shader,从而实现跨平台。

 

Shader程序结构

 

  • 属性定义(Property Definition):定义Shader的输入,这些输入可以在材质编辑的时候指定
  • 子着色器(SubShader):一个Shader可以有多个子着色器。这些子着色器互不相干且只有一个会在最终的平台运行编写多个的目的是解决兼容性问题。Unity会自己选择兼容终端平台的Shader运行。
  • 回滚(Fallback):如果子着色器在终端平台上都无法运行,那么使用Fallback指定的备用Shader,俗称备胎。
  • Pass:一个Pass就是一次绘制。对于表面着色器,只能有一个Pass,所以不存在Pass节。顶点片段着色器可以有多个Pass。多次Pass可以实现很多特殊效果,例如当人物被环境遮挡时还可以看到人物轮廓就可以用多Pass来实现。
  • Cg代码:每个Pass中都可以包含自定义的Cg代码,从CGPROGRAM开始到ENDCG结束。

Shader 输入

 

Shader的输入有两个来源,一是通过属性定义,一是通过Shader.SetGlobalXXX方法全局设置。

  • 属性定义变量:属性定义中的变量是Shader参数的主要设置方式。 它是随材质变化的,每个使用该Shader的材质都可以在Inspector或者脚本中设置这些参数。这些参数除了在Shader的Properties段中定义外,还需要在Cg中声明方可使用。例如上面表面着色器的例子中我们定义了_MainTex这个类型为2D的属性,还需要在Cg中声明 sampler2D _MainTex。

  • 全局变量:Shader有一组SetGlobalXXX方法,可以对Shader的在Cg中定义而没有在属性中定义的uniform变量进行设置。这个设置是全局的,所有定义了该uniform的Shader都会受到影响。例如我们希望场景随着时间变化而改变颜色,就可以给场景所使用到的Shader设置统一的全局颜色变量,然后在脚本中通过设置该颜色来改变场景的颜色。在角色释放技能时场景变黑也可以使用这个方法。

Unity shader 中允许定义的属性类型有:

关键字 类型 对应Cg类型
Float 浮点数 float _MyFloat (“My float”,Float) = 0.5
Range 浮点数 (在指定范围内) float _MyRange (“My Range”,Range(0.01,0.5)) = 0.1
Color 浮点四元组 float4 _MyColor (“Some Color”,Color) = (1,1,1)
Vector 浮点四元组 float4 _MyVector(“Some Vector”,Vector) = (1,1)
2D 2的阶数大小的贴图 sampler2D _MyTexture (“Texture”,2D) = “white” {}
Rect 非2的阶数大小的贴图 sampler2D _MyRect(“My Rect”,Rect) = “white” {}
CUBE CubeMap samplerCUBE _MyCubemap (“Cubemap”,CUBE) = “” {}

注:CubeMap 是6张有联系的2D贴图的组合主要用来做反射效果(比如天空盒和动态反射)

SubShader

SubShader中除了Pass,有两个标签值得关注:LOD和Tags

LOD

LOD是 Level of Detail的简写,确切地说是Shader Level of Detail的简写,因为Unity中还有一个模型的LOD概念,这是两个不同的东西。我们这里只介绍Shader中LOD

Shader LOD 就是让我们设置一个数值,这个数值决定了我们能用什么样的Shader。可以通过Shader.maximumLOD或者Shader.globalMaximumLOD 设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。通过LOD,我们就可以为某个材质写一组SubShader,指定不同的LOD,LOD越大则渲染效果越好,当然对硬件的要求也可能越高,然后根据不同的终端硬件配置来设置 globalMaximumLOD来达到兼顾性能的最佳显示效果。

Unity内建Shader定义了一组LOD的数值,我们在实现自己的Shader的时候可以将其作为参考来设定自己的LOD数值

  • VertexLit及其系列 = 100
  • Decal,Reflective VertexLit = 150
  • Diffuse = 200
  • Diffuse Detail,Reflective Bumped Unlit,Reflective Bumped VertexLit = 250
  • Bumped,Specular = 300
  • Bumped Specular = 400
  • Parallax = 500
  • Parallax Specular = 600

 

Tag

 

SubShader可以被若干的标签(tags)所修饰,而硬件将通过判定这些标签来决定什么时候调用该着色器。 
比较常见的标签有:

  • Queue 
    这个标签很重要,它定义了一个整数,决定了Shader的渲染的次序,数字越小就越早被渲染,早渲染就意味着可能被后面渲染的东西覆盖掉看不见。 
    预定义的Queue有:
名字 描述
Background 1000 最早被调用的渲染,用来渲染天空盒或者背景
Geometry 2000 这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的)
AlphaTest 2450 用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑
Transparent 3000 以从后往前的顺序渲染透明物体
Overlay 4000 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效)
  • RenderType 
    “Opaque”或”Transparent”是两个常用的RenderType。如果输出中都是非透明物体,那写在Opaque里;如果想渲染透明或者半透明的像素,那应该写在Transparent中。这个Tag主要用ShaderReplacement,一般情况下这Tag好像也没什么作用。

CommonState

SubShader中可以定义一组Render State,基本上就是一些渲染的开关选项,他们对该SubShader的所有的Pass都有效,所以称Common。这些Render State也可以在每个Pass中分别定义,将在Pass中详细介绍。

Pass

Render State

Render State主要就是控制渲染过程的一些开关选项,例如是否开启alpha blending ,是否开启depth testing。 
常用的Render State有:

  • Cull 
    用法:Cull Back | Front | Off 
    多边形表面剔除开关。Back表示背面剔除,Front表示正面剔除,Off表示关闭表面剔除即双面渲染。有时候如裙摆,飘带之类很薄的东西在建模时会做成一个面片,这就需要设置Cull Off来双面渲染,否则背面会是黑色。

  • ZWrite 
    用法:ZWrite On | Off 
    控制当前对象的像素是否写入深度缓冲区(depth buffer),默认是开启的。一般来说绘制不透明物体的话ZWrite开启,绘制透明或半透明物体则ZWrite关闭。 
    深度缓冲区:当图形处理卡渲染物体的时候,每一个所生成的像素的深度(即 z 坐标)就保存在一个缓冲区中。这个缓冲区叫作 z 缓冲区或者深度缓冲区,这个缓冲区通常组织成一个保存每个屏幕像素深度的 x-y 二维数组。如果场景中的另外一个物体也在同一个像素生成渲染结果,那么图形处理卡就会比较二者的深度,并且保留距离观察者较近的物体。然后这个所保留的物体点深度保存到深度缓冲区中。最后,图形卡就可以根据深度缓冲区正确地生成通常的深度感知效果:较近的物体遮挡较远的物体。 
    理解了深度缓冲区也就理解了为什么绘制透明或半透明物体需要关闭ZWrite,如果不关闭,透明物体的depth也会被写入深度缓冲区,从而会剔除掉它后面的物体,后面的物体就不会被渲染,看不见后面的物体还能叫透明吗?因此我们使用Alpha blending的时候需要设置ZWrite Off。

  • ZTest 
    用法:ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) 
    控制如何进行深度测试,也就是上面说的图形处理卡比较二者的深度的比较方法。默认是LEqual。 
    值得一提的是使用Aplha blending的时候ZWrite需要关闭但是ZTest是要开启的,因为如果透明物体前面还有不透明物体,透明物体还是应该被遮挡剔除的。

Blend 
混合。控制了每个Shader的输出如何和屏幕上已有的颜色混合。 
用法: 
Blend Off: 关闭混合 
Blend SrcFactor DstFactor:最终颜色 = Shader产生的颜色 × SrcFactor + 屏幕上原来的颜色 × DstFactor 
Blend SrcFactor DstFactor,SrcFactorA DstFactor:和上面一样,只是Alpha通道使用后面两个参数计算 
常用的Blend模式有: 
Blend SrcAlpha OneMinusSrcAlpha // Alpha blending 
Blend One One // Additive 
Blend OneMinusDstColor One // Soft Additive 
Blend DstColor Zero // Multiplicative 
Blend DstColor SrcColor // 2x Multiplicative 

 

Unity5开始下列固定功能的Shader命令被标记为过时了,这些命令的功能现在建议在Shader(Cg)中通过代码来实现,这里列出是为了方便阅读以前写的Shader:

  • Lighting On | Off
  • Material { Material Block }
  • SeparateSpecular On | Off
  • Color Color-value
  • ColorMaterial AmbientAndDiffuse | Emission
  • Fog { Fog Block }
  • AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
  • SetTexture textureProperty { combine options }

Surface Shader

Surface Shader 隐藏了很多光照处理的细节,它的设计初衷是为了让用户仅仅使用一些指令(#pragma)就可以完成很多事情,并且封装了很多常用的光照模型和函数。相比底层的Vertex And Fragment Shader,Suface Shader的限制比较多,它只能有一次Pass。如果做一些常规的功能又需要光照,可以用Surface Shader写,比较快速便捷。如果要写比较高级的Shader还是建议使用Vertex Shader 和 Fragment Shader。 
Surface Shader主要有两部分组成,一个是#pragma后面的指令,一个是surf函数。 
pragma的语法是 #pragma surface surfaceFunction lightModel [optionalparams] 
- surfaceFunction 通常就是名为surf的函数,函数名可以自己取 
surf函数原型是:void surf (Input IN,inout SurfaceOutput o) 
- lightModel是Unity内置的光照模型,可以是Lambert,Blinn-Phong等。 
- optionalparams: 包含很多指令 

surf函数主要有一个Input结构的输入和SurfaceOutput结构的输出。

Input

Input 结构需要在Shader中定义。它可以包含如下字段,如果你定义了这些字段就可以在surf函数中使用它们(好神奇的黑科技)

  • 多个贴图的uv坐标,名字必须符合格式uv+贴图名。例如 float2 uv_MainTex
  • float3 viewDir - 视图方向( view direction)值。为了计算视差效果(Parallax effects),边缘光照(rim lighting)等,需要包含视图方向( view direction)值。
  • float4 with COLOR semantic - 每个顶点(per-vertex)颜色的插值。
  • float4 screenPos - 屏幕空间中的位置。 为了反射效果,需要包含屏幕空间中的位置信息。比如在Dark Unity中所使用的 WetStreet着色器。
  • float3 worldPos - 世界空间中的位置。
  • float3 worldRefl - 世界空间中的反射向量。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。 请参考这个例子:Reflect-Diffuse 着色器。
  • float3 worldNormal - 世界空间中的法线向量(normal vector)。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。
  • float3 worldRefl; INTERNAL_DATA - 世界空间中的反射向量。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。
  • float3 worldNormal; INTERNAL_DATA -世界空间中的法线向量(normal vector)。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。

SurfaceOutput

SurfaceOutput 描述了表面的特性(光照的颜色反射率、法线、散射、镜面等),这个结构是固定的,不需要在Shader中再定义。

struct SurfaceOutput {     half3 Albedo;       //反射率,一般就是在光照之前的原始颜色     half3 Normal;       //法线     half3 Emission;     //自发光,用于增强物体自身的亮度,使之看起来好像可以自己发光     half Specular;      //镜面     half Gloss;         //光泽     half Alpha;         //透明 };

Unity5 由于引入了基于物理的光照模型,所以新增加了两个Output

struct SurfaceOutputStandard {     fixed3 Albedo;      // base (diffuse or specular) color     fixed3 Normal;      // tangent space normal,if written     half3 Emission;     half Metallic;      // 0=non-metal,1=metal     half Smoothness;    // 0=rough,1=smooth     half Occlusion;     // occlusion (default 1)     fixed Alpha;        // alpha for transparencies }; struct SurfaceOutputStandardSpecular {     fixed3 Albedo;      // diffuse color     fixed3 Specular;    // specular color     fixed3 Normal;      // tangent space normal,if written     half3 Emission;     half Smoothness;    // 0=rough,1=smooth     half Occlusion;     // occlusion (default 1)     fixed Alpha;        // alpha for transparencies };

Unity提供了一些基本的SurfaceShader的例子,有助于我们理解输入输出是如何被使用的。 
Unity提供的SurfaceShader的例子

Vertex Shader

如果不想使用Surface Shader而直接编写opengl和Direct3D中常见的顶点着色器和片段着色器,可以通过Cg代码段嵌入到Pass中:

  Pass {       // ... the usual pass state setup ...        CGPROGRAM       // compilation directives for this snippet,e.g.:       #pragma vertex vert       #pragma fragment frag        // the Cg/HLSL code itself        ENDCG       // ... the rest of pass setup ...   }

其中vert就是顶点着色器函数,frag就是片段着色器函数。一般来说,可以在顶点着色器中进行的计算就不应该放到片段着色器中去算,因为顶点着色器是逐顶点计算的而片段着色器是逐像素计算的,一个模型顶点总比表明像素少很多吧。

编写顶点和片段着色器一般需要包含Unity预定义的一个帮助文件UnityCG.cginc,里面预定义了一些常用的结构和方法。Windows版Unity这个文件位于({unity install path}/Data/CGIncludes/UnityCG.cginc。 Mac版位于/Applications/Unity/Unity.app/Contents/CGIncludes/UnityCG.cginc

在代码中我们只需要添加 #include "UnityCG.cginc"就可以使用里面的结构和方法。

Input

顶点着色器的原型是 v2f vert (appdata v) 
appdata 是输入,可以自己定义也可以使用Unity预定义的。Unity在UnityCG.cginc预定义了三种常用的输入结构:appdata_base,appdata_tan,appdata_full。

struct appdata_base {     float4 vertex : POSITION;     float3 normal : NORMAL;     float4 texcoord : TEXCOORD0; };  struct appdata_tan {     float4 vertex : POSITION;     float4 tangent : TANGENT;     float3 normal : NORMAL;     float4 texcoord : TEXCOORD0; };  struct appdata_full {     float4 vertex : POSITION;     float4 tangent : TANGENT;     float3 normal : NORMAL;     float4 texcoord : TEXCOORD0;     float4 texcoord1 : TEXCOORD1;     float4 texcoord2 : TEXCOORD2;     float4 texcoord3 : TEXCOORD3; #if defined(SHADER_API_XBOX360)     half4 texcoord4 : TEXCOORD4;     half4 texcoord5 : TEXCOORD5; #endif     fixed4 color : COLOR; };

我们注意到这些结构的字段和表面着色器中的字段不同,后面多了一个冒号和一个标签。这是该字段的语义,用于告诉GPU这个字段的数据应该去哪里读写。GPU毕竟是为了图形计算而特别设计的东西,很多东西都是固定的,我们只要记得有这么几个名字可以用行了。

类型 名字 标签 备注
float4 vertex POSITION 顶点在模型坐标系下的位置
float3 normal NORMAL 顶点的法向量
float4 tangent TANGENT 顶点的切向量
float4 color COLOR 顶点色
float4 texcoord TEXCOORD0 顶点的第一个uv坐标
float4 texcoord1 TEXCOORD1 顶点的第二个uv坐标,最多可以到5

Output

顶点着色器的输出是也是一个可以自己定义的结构,但是结构内容也是比较固定的,一般包含了顶点投影后的位置,uv,顶点色等,也可以加一些后面片段着色器需要用到但是需要在顶点着色器中计算的值。这个输出就是后面片段着色器的输入。

 struct v2f   {     float4 pos : SV_POSITION;     half2 uv   : TEXCOORD0;  };

可以使用的字段有:

类型 标签 描述
float4 SV_POSITION 顶点在投影空间下的位置,注意和输入的模型坐标系下的位置不同,这个字段必必须设置,这个坐标转换是顶点着色器的重要工作
float3 NORMAL 顶点在视图坐标系下的法向量
float4 TEXCOORD0 第一张贴图的uv坐标
float4 TEXCOORD1 第二张贴图的uv坐标
float4 TANGENT 切向量,主要用来修正法线贴图Normal Maps
fixed4 COLOR 第一个定点色
fixed4 COLOR1 第二个定点色
Any Any 其他自定义的字段

坐标变换

顶点着色器有一项重要的工作就是进行坐标变换。顶点着色器的输入中的坐标是模型坐标系(ObjectSpace)下的坐标,而最终绘制到屏幕上的是投影坐标。 
在我们Shader里面只需要一句话就可以完成坐标的转换,这也是最简单的顶点着色器:

v2f vert(appdata v) {           v2f o;           o.pos = mul(UNITY_MATRIX_MVP,v.vertex);           return o; }

用UNITY_MATRIX_MVP矩阵乘以顶点在模型坐标系下的坐标就得到投影坐标。 
UNITY_MATRIX_MVP是Unity内建的模型->视->投影矩阵, Unity内建矩阵如下:

  • UNITY_MATRIX_MVP:当前模型->视图->投影矩阵。(注:模型矩阵为 本地->世界)
  • UNITY_MATRIX_MV:当前模型->视图矩阵
  • UNITY_MATRIX_V:当前视图矩阵
  • UNITY_MATRIX_P:当前投影矩阵
  • UNITY_MATRIX_VP:当前视图->投影矩阵
  • UNITY_MATRIX_T_MV:转置模型->视图矩阵
  • UNITY_MATRIX_IT_MV:逆转置模型->视矩阵,用于将法线从ObjectSpace旋转到WorldSpace。为什么法线变化不能和位置变换一样用UNITY_MATRIX_MV呢?一是因为法线是3维的向量而- UNITY_MATRIX_MV是一个4x4矩阵,二是因为法线是向量,我们只希望对它旋转,但是在进行空间变换的时候,如果发生非等比缩放,方向会发生偏移。
  • UNITY_MATRIX_TEXTURE0 to UNITY_MATRIX_TEXTURE3:纹理变换矩阵

下面简单介绍一下里面提到的几个坐标系: 
模型坐标系:也叫物体坐标系,3D建模的时候每个模型都是在自己的坐标系下建立的,如果一个人物模型脚底是(0,0) 点的话它的身上其它点的坐标都是相对脚底这个原点的。 
世界坐标系:我们场景是一个世界,有自己的原点,模型放置到场景中后模型上的每个顶点就有了一个新的世界坐标。这个坐标可以通过模型矩阵×模型上顶点的模型坐标得到。 
视图坐标系:又叫观察坐标系,是以观察者(相机)为原点的坐标系。场景中的物体只有被相机观察到才会绘制到屏幕上,相机可以设置视口大小和裁剪平面来控制可视范围,这些都是相对相机来说的,所以需要把世界坐标转换到视图坐标系来方便处理。 
投影坐标系:场景是3D的,但是最终绘制到屏幕上是2D,投影坐标系完成这个降维的工作,投影变换后3D的坐标就变成2D的坐标了。投影有平行投影和透视投影两种,可以在Unity的相机上设置。 
屏幕坐标系 : 最终绘制到屏幕上的坐标。屏幕的左下角为原点。

除了内建矩阵,Unity还内建了一些辅助函数也可以在顶点着色器里面使用:

  • float3 WorldSpaceViewDir (float4 v):根据给定的局部空间顶点位置到相机返回世界空间的方向(非规范化的)
  • float3 ObjSpaceViewDir (float4 v):根据给定的局部空间顶点位置到相机返回局部空间的方向(非规范化的)
  • float2 ParallaxOffset (half h,half height,half3 viewDir):为视差法线贴图计算UV偏移
  • fixed Luminance (fixed3 c):将颜色转换为亮度(灰度)
  • fixed3 DecodeLightmap (fixed4 color):从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR)
  • float4 EncodeFloatRGBA (float v):为储存低精度的渲染目标,编码[0..1)范围的浮点数到RGBA颜色。
  • float DecodeFloatRGBA (float4 enc):解码RGBA颜色到float。
  • float2 EncodeViewNormalStereo (float3 n):编码视图空间法线到在0到1范围的两个数。
  • float3 DecodeViewNormalStereo (float4 enc4):从enc4.xy解码视图空间法线

Fragment Shader

// TODO

 

语义

  • 从应用阶段传递模型数据到顶点着色器时Unity经常使用的语义

语义 描述
POSITION 模型空间中模型顶点坐标位置,通常是float4类型
NORMAL 顶点法线,通常是float3类型
TANGENT 顶点切线,通常是float3类型
TEXCOORDn 顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标以此类推,通常是float2或float4
COLOR 顶点的颜色,通常是float4或fixed4

  • 从顶点着色器到片元着色器Unity经常使用的语义

语义 描述
SV_POSITION 裁剪空间中顶点坐标,结构体中必须有一个用该语义修饰的变量
等同于DirectX9中的POSITION,但最好使用SV_POSITION
COLOR0 通常用于修饰第一组顶点颜色,但不是必须的
COLOR1 通常用于修饰第二在顶点颜色,但不是必须的
TEXCOORD0~TEXCOORD7 通常用于修饰纹理坐标,但不是必须的

补充说明:这些语义除了SV_POSITION比较特殊以外,其他的语义基本上没有明确的要求,
可以储存任意数据到这些语义修饰的变量中。另外,通常我们习惯于用
TEXCOORD0来修饰自定义的变量。

  • 片元着色器输出时Unity支持的语义

SV_Target 等同于DirectX9中的COLOR,但我们最好用SV_Target。表示的是将输出数据
传递给render_target(渲染目标)

DEPTH  片段的深度

补充

Shader代码辅助工具安装指南: https://connect.unity.com/p/shaderdai-ma-fu-zhu-gong-ju-an-zhuang-zhi-nan

vs+shader语法提示插件(亲测可用):https://github.com/wudixiaop/ShaderlabVS/releases

Unity Shader之TRANSFORM_TEX方法: https://blog.csdn.net/u010133610/article/details/78789940

Unity Shader 之 vertex and fragment 概览: http://www.7fires.cn/archives/22

Unity Shader - 一些玩具Shader: https://www.jianshu.com/p/7cbae91e88d1

unityShader CGINCLUDE关键字: https://www.cnblogs.com/fengxing999/p/10012256.html

 

原文地址:https://linxinfa.blog.csdn.net

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先