项目中遇到这个宏的问题TRANSFER_VERTEX_TO_FRAGMENT,它定义在AutoLight.cginc文件中,它会与宏LIGHTING_COORDS协同工作,它会根据该pass处理的光源类型( spot 或 point 或 directional )来计算光源坐标的具体值,以及进行和 shadow 相关的计算等。 在pc平台的时候,它会去调用一个在UnityCG.cginc文件中的ComputeScreenPos...
如果我们想要使用上述方法实现描边,我们就需要写另一种shader——fragment shader。和surface shader相比,这种shader需要我们编写更多的代码,处理更多的事情,但也可以让我们更加了解shader是如何工作的。而之前的一篇文章也分析过,其实surface shader的背后也是生成了对应的vertex&fragment shader。 这篇文章主要参考了Unity G...
o.pos = UnityObjectToClipPos(v.vertex); o.uv0 = v.uv0; o.nDirWS = UnityObjectToWorldNormal(v.normal); o.posWS = mul(unity_ObjectToWorld, v.vertex).xyz; TRANSFER_VERTEX_TO_FRAGMENT(o) //阴影 return o; } half4 frag (v2f i) : SV_Target { //【贴图采样】 half4 var_MainTex...
o.pos = mul( UNITY_MATRIX_MVP, v.vertex); o.normal = mul((float3x3)_Object2World, SCALED_NORMAL); //Get the UV coordinates o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); // pass lighting information to pixel shader TRANSFER_VERTEX_TO_FRAGMENT(o); return o; } float4 frag(v2f i)...
在fragment shaders里,空间(spaces)的概念是非常重要的。空间重要是指坐标的相对位置。 在model space中,坐标是相对于网格的原点(0,0,0)定义的。我们的vertexfunction需要把这些坐标转换到clipspace中,为投影做准备。 在tangent space中,坐标是相对于模型的正面定义的——在处理法线纹理时我们使用这个space,这在后面...
在Unity中有3种Shader(就是三种不同的写法),Surface Shaders表面着色器Vertex/Fragment Shaders顶点/片断着色器Fixed Function Shaders固定管线着色器,其中FixedFunctionShaders已经被淘汰。 Surface Shader其实就是Unity对Vertex Fragment Shader的又一层包装,以使Shader的制作方式更符合人类的思维模式,同时可以以极少的...
surface shader隐藏了好多的内部实现,像多光源,阴影,衰减等问题,在surface shader中都是被隐藏实现好了的,而且还是多平台适配的,Vertex & Fragment Shader则还要自己写,还好unity也给我们提供了一些现成方法可以调。 所以总结一下,在写需要接收复杂光源信息的材质时,写surface shader应该会简单不少。
顶点着色器:TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) 这个宏需要v.vertex和v.normal,我们可以在顶点着色器中对vertex和normal变量进行修改再传入宏中 片元着色器:SHADOW_CASTER_FRAGMENT(i); 知识点132:水波效果 原理:利用噪声纹理生成法线贴图,我们再根据Time.y处理纹理坐标,根据纹理坐标在法线贴图上采样,得到水波的...
Shader "Unlit/Simple Particle Unlit" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // 实现模糊效果 #pragma multi_compile_fog ...
TRANSFER_VERTEX_TO_FRAGMENT(o);// Calculates shadow and light attenuation and passes it to the frag shader. //in frag shader; floatatten = LIGHT_ATTENUATION(i);// This is a float for your shadow/attenuation value, multiply your lighting value by this to get shadows. Replace i with whatev...