-
Materialization FX 1.0 溶解效果shader unity3d asset Unity插件下载 3d游戏开发
2018-05-25 12:11:11Materialization FX 1.0 unity3d asset Unity插件下载 3d游戏开发 插件详情: 溶解 资源版本: V1.0 unity版本: 官方推荐Unity版本号:Unity5.5.1 or higher -
Unity3D Built-in Shader,unity3d内置shader详解1
2013-06-19 09:24:15Unity3D内置了很多Shader,文档很详细,自己翻一下.便于加深印象. 首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微软的.FX文件或者NVIDIA的CgFX有些类似。传统意义上...http://wenku.baidu.com/view/e82c4e196bd97f192279e922.htmlUnity3D内置了很多Shader,文档很详细,自己翻一下.便于加深印象.
首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微软的.FX文件或者NVIDIA的CgFX有些类似。传统意义上的vertex shader和pixel shader 还是使用标准的Cg/HLSL 编程语言编写的。(因此Unity文档里面的Shader,都是指用ShaderLab编写的代码)
然后我们来看下Unity3D自带的60多个Shader。 这些Shader被分为五个大类:Normal,Transparent,Transparent Cutout,Self-llluminated,Reflective。由于数量比较多,将分几个篇幅一一介绍。
(一) Normal Shader Family
这个家族一共9个Shader,都是针对不透明的对象的。
(1) Vertex-Lit:
最简单的一种Shader之一,所有照射在该物体上的光在一个Pass里面渲染完,光源只在顶点计算。所以不会有任何基于像素渲染得效果,比如说:normal mapping,light cookies和shadows.这个shader对模型的剖分(将一个物体从几何描述变为多边形表示的过程)非常敏感,如果你将一个点光源放在很靠近一个立方体的一个顶点那里,并且对立方体使用这个shader,光源只会在角落计算。基于像素光照的shader对剖分没有要求,在表现圆形高光上效果也很好。如果上述情况时你想要的效果,你可以考虑使用一个基于像素光照的shader或者增加模型的剖分。(增加顶点数)
总的来说,这个shader的渲染代价比较小。这个shader包含了2个subshader,分别对应可编成管线和固定管线。是所有硬件都支持的一个最基本的shader。如果设备支持可编成管线,那使用可编成管线的subshader,否则使用固定管线的。
(2) Diffuse:
Diffuse基于一个简单的光照模型-Lambertian,光照强度随着物体表面和光入射角夹角的减小而减小(即光垂直于表面时强度最大)。光照的强度只和该角度有关系,和摄像机无关。由于这是一个基于像素光照的shader,因此他有这类shader的优势,同时他需要设备支持可编程管线,如果设备不支持,则自动使用Vertex-Lit这个Shader。
总的来说,这个shader渲染代价比较小。
(3) Specular
Specular 使用和Diffuse相同的光照模型,但是添加了一个和观察角度相关的反射高光。这个被称为Blinn-Phong光照模型。他包含了一个反射强光,这个反射高光物体表面角度,光的入射角度以及观察者角度都有关系。这种高光计算方法实际上是对实时光源模糊反射的一种具有可行性的模拟。模糊的等级通过inspector里面Shininess这个变量控制。
主纹理的alpha通道被用来当作Specular Map来使用(有时候也称gloss map),它定义了物体的反光率。纹理中alpha里面全黑 的部分将完全不反光(即反光率为0%)。而全白的的部分反光率为100%。这个Map在你的物体在不同的部分有不同的反光率的时候非常有用。比如说,锈迹斑斑的金属会反光率低,而磨光的金属反光率比较高。口红的反光率比皮肤高,而皮肤的反光率比棉质衣服高。一个精心制作的Specular Map将会让玩家身临其境。如果目标设备不支持可编程管线,则自动使用Vertex-Lit这个Shader。
这个shader的渲染代价会比较大。
(4)Bumped Diffuse
同Diffuse Shader一样,这个Shader基于Lambertian光照模型,同时使用了normal mapping技术来增加物体表面细节。相对于通过增加剖分来表现物体表面细节的方式,normal mapping并不改变物体的形状,而是使用一张称为Normal Map的特殊纹理来达到这种效果。在normal map中,每个象素的颜色代表了该像素所在物体表面的法线,然后通过这个法线(而不是通过物体模型计算而来的法线)来计算光照。可以说Normal Map在计算光照的过程中“高效地修改”了整个模型。
如何创建Normal maps:你可以通过导入一张普通的灰度图(白色表示凸起,黑色表示凹进)Unity会自动将它转换为Normal Map。
技术细节:这里使用Normal map是一种“Tangent space Normal Map”,Tangent space(正切空间)是一个跟随模型物体表面的空间。在这个空间中,z轴始终从表面指向外面。Tangent space Normal Map相对于另一种被称为“Object space Normal Map”来说有点复杂,但是他有一些优势。1)可以使用在各种奇形怪状的表面 2)便于在同一物体不同区域或者不同物体间复用
具体关于Tangent Space Normal Map和Object Space Normal Map的区别,下次再讲。
如果调用这个shader失败,则会调用Diffuse这个shader,一般而言,该shader渲染代价低。
(5) Bumped Specular
和Specular一样的光照模型,相比Specular而言,它使用一张Tangent Space Normal Map来描述物体表面法向量的变化,来增加物体细节。(关于normal map具体见Bumpped Diffuse)如果调用失败,则使用Specular这个shader,一般而言,这个shader的渲染代价会比较大。
(6) Parallax Diffuse
Parallax Normal mapped与传统的normal mapped一样,但是对“深度”的模拟更佳。额外的深度效果是通过Height Map(高度图)来实现的。Height Map在Normal map的alpha通道里面保存。全黑表示么有高度,而白色表示有高度。通常这用来表现石头或者砖块间的裂缝。
Parallax mapping的技术很简单,因此会有些人工痕迹或者不太正常的效果出现。尤其是,急剧陡峭的高低转换在高度图里面应该避免。在inspector里面调整height数值来调整高度的范围,有时候会造成物体不真实,凌乱的情况。因此建议使用高度变化平缓的高度图或者将高度数值设置比较低,让表面看起来比较平缓。
这个shader的渲染代价相比bumped diffuse而言更大。如果调用这个Shader失败,则自动使用Bumped Diffuse。
(7) Parallax Specular
与Bumped Spcular相比,增加了一张Height Map来描述深度细节。关于Height Map,见parallax Diffuse。如果调用失败,则调用Bumped Specular这个Shader。
(8) Decal
这个Shader在unity文档里面的描述和Unity3.0有明显的实现区别,文档由于比较老,07年写的,官网下的Built-in Shader里面,decal是使用可编程管线实现的,就是说,如果你的机器不支持可编程管线,会使用diffuse,因为diffuse也不需要可编程管线,所以只能使用vertex-lit。这个Shader除了主纹理之外,这个Shader还是用了第二张纹理用来描述细节。第二张用来Decal(贴花)的纹理使用alpha通道来确定是否覆盖主纹理。贴花用的纹理只是对主纹理的补充。比如说你有一个砖砌的墙壁,你可以使用一个砖块的纹理作为主纹理,然后使用带有alpha通道的Decal纹理在墙壁的不同地方涂鸦。
(9) Diffuse Detail
这是一个普通的diffuse shader加上一些额外数据的shader。它允许你定义第二张纹理,称为Detail Texture。当camera靠近的时候,Detail Texture逐渐显示出来,一般用于地形。比如说,当你使用一张低分辨率的纹理拉升到整个地形上的时候。随着camera逐渐拉近,低分辨率的纹理开始模糊,这不是我们想要的效果。为了避免这个效果,创建一张Detail 纹理会将地形tile化。在这种模式下,随着camera逐渐拉近,额外的细节将会出现以避免出现模糊的效果。
Detail 纹理是覆盖在主纹理上面的。Detail纹理中深色的部分将会使得主纹理变深,而淡色的部分将会使主纹理变亮,Detail纹理通常是浅灰色。(与Decal里面Decal纹理不同的是,Decal纹理是RGBA,通过alpha控制Decal Texture与Main Texture的融合,而Detail的纹理是RGB,直接是两张纹理的rgb通道分别相乘再*2,就是说,Detail纹理中颜色数值 = 0.5不会改变主纹理颜色,>0.5会变亮,<0.5加深)
-
Unity3D: Shader
2016-12-28 08:20:20Shader编程提示instruction超限 解决方法,加上target3.0,提高版本,不过运行效率待考究。...unity3d中,mobil上的shader也可以改为双面显示,只要在shader里面加上culloff Shader Fallback 某些shaderShader编程提示instruction超限
解决方法,加上target3.0,提高版本,不过运行效率待考究。
Target不对的话,就算没有报错,,某些功能如挖洞也可能没有效果。
双面shader
unity3d中,mobil上的shader也可以改为双面显示,只要在shader里面加上culloff
Shader Fallback
某些shader不能够在android平台上使用,当打开shader的时候,会在最后边发现
这是
这种shader在android平台上打包后加载,发现建筑变暗了,调查后得出的结论。
Shader alpha test
alpha test 设置为Greater0的时候,手机平台就不会提示androidclip
-
Awesome-Unity-Shader:关于炫酷的Unity3D Shader | 关于Cool Unity3D着色器-源码
2021-02-04 23:52:58这主要是自己博客专栏《【浅墨Unity3D Shader编程】》中推出的一些Shader代码的收集。 着色器专栏地址: : 推荐新的高品质Unity Shader项目| 推荐新的很棒的Unity Shader库 X-PostProcessing Libray,简称XPL,是... -
【Unity3d Shader】Unity3D 渲染路学习笔记之前向渲染
2019-01-21 10:39:29Unity支持多种渲染路径。具体我们应该使如何使用渲染路径,取决于我们项目中的灯光、阴影。 渲染路径需要GPU的支持,如果GPU不支行该渲染...在Unity3d工程中,我们有三个地方可以设置渲染路径。 1.我们可以在Gr...Unity支持多种渲染路径。具体我们应该使如何使用渲染路径,取决于我们项目中的灯光、阴影。
渲染路径需要GPU的支持,如果GPU不支行该渲染路径,将依次降级使用下一个Deffered -> Forward -> Vertex Lit。
同一个项目可以用同一种渲染路径,也可以多个渲染路径混合着用。
在Unity3d工程中,我们有三个地方可以设置渲染路径。
1.我们可以在GraphicsSettings面版下全局设置渲染路径,默认是Forward即前向渲染。(见下图)
2.不同的Camera可以有不同的渲染路径。(见下图)
3.Shader的Pass中可以设置渲染路径。(见下图)
果我们都使用指定Forward Rendering(默认),在shader的Pass中不做指定,那么使用的是VertexLit。
- http://docs.unity3d.com/Manual/RenderTech-DeferredShading.html
- http://docs.unity3d.com/Manual/RenderTech-ForwardRendering.html
- http://docs.unity3d.com/Manual/RenderTech-VertexLit.html
Forward Rendering 前向渲染
前向渲染渲染每个物体的时候会用到一个或多个Pass,具体用多少个Pass依赖于作用于该物体的灯光。
前向渲染会根据灯光的设置以及这些灯光对物体的形象程度对这灯光进度一个重要程序排序。重要的灯光认真对待(效果好),不重要的灯光高效率对待(效果差),照射不到该物体的灯光不做处理。
在前向渲染 (Forward Rendering) 中,影响每个对象的一定数量的最亮光源以全逐像素光照模式被渲染。然后,最多 4 个点光灯会逐顶点被计算。其他灯根据球谐函数 (SH) 进行计算,这种计算方式更快速,但只能得到近似值。根据以下内容判断某个光源是否是逐像素光源:
- 渲染模式 (Render Mode) 设置为不重要 (Not Important) 的光源通常是逐顶点或球谐函数。
- 最亮的方向灯通常为逐像素。
- 渲染模式 (Render Mode) 设置为重要 (Important) 的光源通常是逐像素。
- 如果以上内容导致光源数量小于当前像素光源数量 (Pixel Light Count)质量设置,则为了降低亮度,会有更多的光源以逐像素的方式进行渲染。
BasePass和AddPass:
- BasePass用一个逐像素方向灯和所有逐顶点、球谐函数光源渲染对象。该通道还从着色器中添加任何光照贴图、环境光照和放射性光照。该通道中渲染的方向灯可以有阴影 (Shadows)。请注意,使用了光照贴图的对象不会获得来自球谐函数光源的光照。
- AddPass中处理其他逐像素光源在其他通道的渲染,一个通道对应一个光源。这些通道中的光源不能有阴影。
效果图如下:
核心代码:
Name "FORWARD_BASE" "LightMode" = "ForwardBase" #pragma multi_compile_fwdbase #include "Lighting.cginc" Name "FORWARD_ADD" "LightMode" = "ForwardAdd" #pragma multi_compile_fwdadd #include "Lighting.cginc" #include "Autolight.cginc" Blend One One #ifdef USING_DIRECTIONAL_LIGHT fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); #else fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz - i.vertexWorldPos.xyz); #endif fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.vertexWorldPos.xyz); #ifdef USING_DIRECTIONAL_LIGHT fixed atten = 1.0; #else float3 lightCoord = mul(unity_WorldToLight, float4(i.vertexWorldPos, 1)).xyz; fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL; #endif
下面上代码:
Shader "mgo/study/forward_render_path" { Properties { _MainTex ("Texture", 2D) = "white" {} _SpecularTex("_SpecularTex", 2D) = "white" {} _SpecularGloss("_SpecularGloss", Range(0.01, 100)) = 30 } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { Name "FORWARD_BASE" Tags{ "LightMode" = "ForwardBase" } CGPROGRAM #pragma multi_compile_fwdbase #pragma vertex vertBase #pragma fragment fragBase #include "UnityCG.cginc" #include "Lighting.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal : NORMAL; }; struct v2f { float2 uv : TEXCOORD0;//纹理 float4 vertex : SV_POSITION;//裁剪空间下的顶点坐标 float3 worldNormal : TEXCOORD1;//世界空间下的法线 float3 vertexWorldPos : TEXCOORD2;//世界空间下的顶点坐标 }; uniform sampler2D _MainTex; uniform sampler2D _SpecularTex; uniform float4 _MainTex_ST; uniform fixed _SpecularGloss; v2f vertBase(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject).xyz; o.vertexWorldPos = mul(unity_ObjectToWorld, v.vertex).xyz; return o; } fixed4 fragBase(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); fixed3 worldNormal = normalize(i.worldNormal); fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.vertexWorldPos.xyz); fixed3 diffuse = _LightColor0.rgb * (dot(worldNormal, worldLight) * 0.5 + 0.5); fixed3 hDir = normalize(viewDir + worldLight); fixed3 specular = _LightColor0.rgb * pow(saturate(dot(worldNormal, hDir)), _SpecularGloss) * tex2D(_SpecularTex, i.uv).r; col.rgb = (col.rgb * diffuse.rgb + specular); return col; } ENDCG } Pass { Name "FORWARD_ADD" Tags{ "LightMode" = "ForwardAdd" } Blend One One CGPROGRAM #pragma multi_compile_fwdadd #pragma vertex vertAdd #pragma fragment fragAdd #include "UnityCG.cginc" #include "Lighting.cginc" #include "Autolight.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal : NORMAL; }; struct v2f { float2 uv : TEXCOORD0;//纹理 float4 vertex : SV_POSITION;//裁剪空间下的顶点坐标 float3 worldNormal : TEXCOORD1;//世界空间下的法线 float3 vertexWorldPos : TEXCOORD2;//世界空间下的顶点坐标 }; uniform sampler2D _MainTex; uniform sampler2D _SpecularTex; uniform float4 _MainTex_ST; uniform fixed _SpecularGloss; v2f vertAdd(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject).xyz; o.vertexWorldPos = mul(unity_ObjectToWorld, v.vertex).xyz; return o; } fixed4 fragAdd(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); fixed3 worldNormal = normalize(i.worldNormal); #ifdef USING_DIRECTIONAL_LIGHT fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); #else fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz - i.vertexWorldPos.xyz); #endif fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.vertexWorldPos.xyz); #ifdef USING_DIRECTIONAL_LIGHT fixed atten = 1.0; #else float3 lightCoord = mul(unity_WorldToLight, float4(i.vertexWorldPos, 1)).xyz; fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL; #endif fixed3 diffuse = _LightColor0.rgb * (dot(worldNormal, worldLight) * 0.5 + 0.5) * atten; fixed3 hDir = normalize(viewDir + worldLight); fixed3 specular = _LightColor0.rgb * pow(saturate(dot(worldNormal, hDir)), _SpecularGloss) * tex2D(_SpecularTex, i.uv).r * atten; col.rgb = (col.rgb * diffuse.rgb + specular); return col; } ENDCG } } }
-
unity3d Cloth Shader
2017-08-16 18:27:21unity3d 着色阴影插件 Cloth Shader -
Unity3D 自带Shader
2016-04-18 10:38:36Unity3d自带的shader,可以通过官网shader来学习shader编程 -
Awesome-Unity-Shader, 分享炫酷的Unity3D着色器| 关于超酷的Unity3D着色程序.zip
2019-09-18 03:21:12Awesome-Unity-Shader, 分享炫酷的Unity3D着色器| 关于超酷的Unity3D着色程序 Awesome-Unity-ShaderShader专栏地址:http://blog.csdn.net/column/details/unity3d-shader.html卷 1凹凸纹理显示 自选边缘颜色和强度... -
Unity3d Glass Shader
2013-04-24 15:31:05Unity3d Glass Shader -
Unity3d倒计时shader冷却shader
2017-12-16 09:49:08unity3d 4.x可用!!5.x没测试过,Unity3d 倒计时shader 技能冷却shder cooldown shader -
Unity3d Shader
2014-06-12 09:37:47Unity3d Shader的属性块结构如下:half4 LightingName (SurfaceOutput s, half3 lightDir, half atten){} This function is used for forward rendering when the view direction is not needed.
Unity3d Shader的属性块结构如下:其中属性类型包括:
三种自定义光照模型方法:
half4 LightingName (SurfaceOutput s, half3 lightDir, half atten){} //This function is used for forward rendering when the view direction is not needed. half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten){} //This function is used in forward rendering when a view direction is needed. half4 LightingName_PrePass (SurfaceOutput s, half4 light){} //This function is used when you are using deferred rendering for your project.
-
[shader]Unity3D地形
2015-12-03 10:20:35Unity的地形shader -
unity3d shader入门精要
2018-05-04 23:30:50unity3d shader 入门文档 总结shader基本结构 和知识 非常实用 -
【Unity3D】夏威夷场景 for Unity3D Shader编程 by浅墨
2014-11-03 17:02:35配套博文:《【浅墨Unity3D Shader编程】之一 游戏场景的创建 & 第一个Shader的书写》 博文链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 说明 --------------------------------------------... -
Unity3D shader简介
2017-11-26 22:50:00Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易。毫无疑问,shader(着色器)编码,仍有很长的路要走。shader是一个专门运行在GPU的程序,经常被神秘包围,它最终绘制3D模型的三角形。如果... -
Unity3D Shader指南
2015-03-02 13:57:08Unity3D Shader入门指南(一) Unity3D Shader入门指南(二) -
unity3d的shader源码
2019-01-17 15:39:53Unity3D 2018.3.0f2 的shader源码 可以作为学习shader的参考,也可以直接扩展之后在unity中使用 -
Shader in Unity3d
2012-09-23 19:23:42Place holder.... -
unity3D双面Shader
2014-01-16 09:26:58在网上看到一个双面的unity3D的Shader拿来与大家一起分享,双面/可灯光烘焙 -
unity3d双面材质_unity3d shader 双面材质
2020-12-30 12:43:44// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "Standard(Two Side)"{Properties{_Color("Color", Color) = (1,1,1,1)_MainTex("Albedo", 2D) = ... -
unity3d 通透材质shader
2015-10-05 16:38:11unity3d 通透材质shader,Subsurface scatteringshader -
Unity3D Shader
2017-01-13 11:08:16本篇文章中,我们学习了Unity Shader的基本写法框架,以及学习了Shader中Properties(属性)的详细写法,光照、材质与颜色的具体写法。写了6个Shader作为本文Shader讲解的实战内容,最后创建了一个逼真的暴风雪场景... -
unity3d及 shader
2018-07-03 11:16:41unity3d及 shader : https://catlikecoding.com/