常用的着色器文件:E:\Other\install\Unity_2018.3.13f1\Unity\Editor\Data\CGIncludes
我的安装路径是这个没有CGIncludes这个文件夹的可能就要去官网下载对应版本的着色器了
常用的文件如下:
UnityCG.cginc:包含了最常用的帮助函数,宏和结构体等
UnityShaderVariables.cginc:在编译UnityShader时,会被自动包含进来。包含了许多内置的全局变量,如UNITY_MATRIX_MVP等
Lighting.cginc:包含各种内置的光照模型,如果编写的是SurfaceShader的话会自动包含进来
HLSLSupport.cginc:在编译UnityShader时,会自动包含进来。声明了很多用于跨平台编译的宏和定义
UnityCG.cginc中一些常用的结构体
appdata_base:可用于顶点着色器的输入,包含顶点位置,顶点法线,第一组纹理坐标
appdata_tan:可用于顶点着色器输入,包含顶点位置,顶点切线,顶点法线,第一组纹理坐标
appdata_full:可用于顶点着色器的输入,包含顶点位置,顶点切线,顶点法线,四组(或更多)纹理坐标
appdata_img:可用于顶点着色器的输入,包含顶点位置,第一组纹理坐标
v2f_img:可用于顶点着色器的输出,包含裁剪空间中的位置,纹理坐标
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
fixed4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_img
{
float4 vertex : POSITION;
half2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f_img
{
float4 pos : SV_POSITION;
half2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
UnityCG.cginc中一些常用的帮助函数
// Computes world space view direction, from object space position
inline float3 UnityWorldSpaceViewDir( in float3 worldPos )
{
return _WorldSpaceCameraPos.xyz - worldPos;
}
// Computes world space view direction, from object space position
// *Legacy* Please use UnityWorldSpaceViewDir instead
//调用上面一个函数,输入一个模型空间中的顶点位置,返回世界空间中该点到摄像机的观察方向
inline float3 WorldSpaceViewDir( in float4 localPos )
{
float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz;
return UnityWorldSpaceViewDir(worldPos);
}
// 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
inline float3 ObjSpaceViewDir( in float4 v )
{
float3 objSpaceCameraPos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos.xyz, 1)).xyz;
return objSpaceCameraPos - v.xyz;
}
// Computes world space light direction, from world space position
inline float3 UnityWorldSpaceLightDir( in float3 worldPos )
{
#ifndef USING_LIGHT_MULTI_COMPILE
return _WorldSpaceLightPos0.xyz - worldPos * _WorldSpaceLightPos0.w;
#else
#ifndef USING_DIRECTIONAL_LIGHT
return _WorldSpaceLightPos0.xyz - worldPos;
#else
return _WorldSpaceLightPos0.xyz;
#endif
#endif
}
// Computes world space light direction, from object space position
// *Legacy* Please use UnityWorldSpaceLightDir instead
//仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化
inline float3 WorldSpaceLightDir( in float4 localPos )
{
float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz;
return UnityWorldSpaceLightDir(worldPos);
}
// Computes object space light direction
//仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有被归一化
inline float3 ObjSpaceLightDir( in float4 v )
{
float3 objSpaceLightPos = mul(unity_WorldToObject, _WorldSpaceLightPos0).xyz;
#ifndef USING_LIGHT_MULTI_COMPILE
return objSpaceLightPos.xyz - v.xyz * _WorldSpaceLightPos0.w;
#else
#ifndef USING_DIRECTIONAL_LIGHT
return objSpaceLightPos.xyz - v.xyz;
#else
return objSpaceLightPos.xyz;
#endif
#endif
}
// Transforms normal from object to world space
//把法线方向从模型空间转换到世界空间中
inline float3 UnityObjectToWorldNormal( in float3 norm )
{
#ifdef UNITY_ASSUME_UNIFORM_SCALING
return UnityObjectToWorldDir(norm);
#else
// mul(IT_M, norm) => mul(norm, I_M) => {dot(norm, I_M.col0), dot(norm, I_M.col1), dot(norm, I_M.col2)}
return normalize(mul(norm, (float3x3)unity_WorldToObject));
#endif
}
// Transforms direction from object to world space
//把方向矢量从模型空间变换到世界空间中
inline float3 UnityObjectToWorldDir( in float3 dir )
{
return normalize(mul((float3x3)unity_ObjectToWorld, dir));
}
// Transforms direction from world to object space
// 把方向矢量从世界空间变换到模型空间
inline float3 UnityWorldToObjectDir( in float3 dir )
{
return normalize(mul((float3x3)unity_WorldToObject, dir));
}
从应用阶段传递模型数据给顶点着色器时Unity常用语义
语义 | 描述 |
---|---|
POSITION | 模型空间中的顶点位置,通常是float4类型 |
NORMAL | 顶点法线,通常是float3类型 |
TANGENT | 顶点切线,通常是float4类型 |
TEXCOORDn,如TEXCOORD0,TEXCOORD1 | 该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,以此类推。通常是float2或者float4类型 |
COLOR | 顶点颜色,通常是fixed4或float4类型 |
从顶点着色器传递数据给片元着色器时Unity常用语义
语义 | 描述 |
---|---|
SV_POSITION | 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量 |
COLORn,如:COLOR0,COLOR1等 | 通常用于输出第一组顶点颜色,但不是必须的 |
TEXCOORD0~TEXCOORD7 | 通常用于输出纹理坐标,但不是必需的 |
书上说:
SV_POSITION是DirectX10中引入的系统数值语义,在绝大多数平台上,它和POSITION语义是等价的,但在某些平台(例如索尼PS4)上必须使用SV_POSITION来修饰顶点着色器的输出,否则无法让Shader正常工作,所以为了让Shader有更好的跨平台性,最好使用SV开头的语义进行修饰。
片元着色器输出时Unity常用语义
语义 | 描述 |
---|---|
SV_Target | 输出值江辉存储到渲染目标(render target)中 |
不过现在好像换成了这种
来源:CSDN
作者:Brand123147
链接:https://blog.csdn.net/qq_15889613/article/details/103969585