Unity3d 内置世界变量

Unity3d 内置世界变量

// The following built-in uniforms (except _LightColor0) 
// are also defined in "UnityCG.cginc", 
// i.e. one could #include "UnityCG.cginc" 
uniform float4 _Time, _SinTime, _CosTime; // time values
uniform float4 _ProjectionParams;
// x = 1 or -1 (-1 if projection is flipped)
// y = near plane; z = far plane; w = 1/far plane
uniform float4 _ScreenParams; 
// x = width; y = height; z = 1 + 1/width; w = 1 + 1/height
uniform float4 unity_Scale; // w = 1/scale; see _World2Object
uniform float3 _WorldSpaceCameraPos;
uniform float4x4 _Object2World; // model matrix
uniform float4x4 _World2Object; // inverse model matrix 
// (all but the bottom-right element have to be scaled 
// with unity_Scale.w if scaling is important) 
uniform float4 _LightPositionRange; // xyz = pos, w = 1/range
uniform float4 _WorldSpaceLightPos0; 
// position or direction of light source
uniform float4 _LightColor0; // color of light source 

表面着色器的标准输出结构(Surface Output)

struct SurfaceOutput   
{  
    half3 Albedo;            //反射率,也就是纹理颜色值(r,g,b)   
    half3 Normal;            //法线,法向量(x, y, z)   
    half3 Emission;          //自发光颜色值(r, g,b)   
    half Specular;           //镜面反射度   
    half Gloss;              //光泽度  
    half Alpha;              //透明度  
};  

表面着色器输入结构(Input Structure)

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)参数,将包含这个参数。为了获得基于每个顶点法线贴图( per-pixel normal map)的反射向量(reflection vector)需要使用世界反射向量(WorldReflectionVector (IN, o.Normal))。请参考这个例子: Reflect-Bumped着色器。
float3 worldNormal; INTERNAL_DATA -世界空间中的法线向量(normal vector)。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。为了获得基于每个顶点法线贴图( per-pixel normal map)的法线向量(normal vector)需要使用世界法线向量(WorldNormalVector (IN, o.Normal))。

saturate( )函数

saturate的字面解释是浸湿,浸透。其作用其实也就是将取值转化为[0,1]之内的一个值。

输入结构

struct Input   
{  
    //主纹理的uv值  _MainTex声明的变量前面加uv 表示取变量uv值
    float2 uv_MainTex;  
    //凹凸纹理的uv值  
    float2 uv_BumpMap;  
};  

//变量声明  
sampler2D _MainTex;//主纹理  
sampler2D _BumpMap;//凹凸纹理 

自定义光照模型

//【1】光照模式声明:使用自定义的光照模式  
        #pragma surface surf SimpleSpecular  
  
        //【2】实现自定义的光照模式SimpleSpecular  
        half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)   
        {  
            half3 h = normalize (lightDir + viewDir);  
  
            half diff = max (0, dot (s.Normal, lightDir));  
  
            float nh = max (0, dot (s.Normal, h));  
            float spec = pow (nh, 48.0);  
  
            half4 c;  
            c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);  
            c.a = s.Alpha;  
            return c;  
        }  

unity3d shader 常用的混合操作

Blend SrcAlpha OneMinusSrcAlpha    // Alpha混合  
Blend One One                       // 相加  
Blend One OneMinusDstColor         // 比较柔和的相加(SoftAdditive)  
Blend DstColor Zero                  // 乘法  
Blend DstColor SrcColor              // 2倍乘法 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容