常用的着色器文件: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_IDUNITY_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_COMPILEreturn _WorldSpaceLightPos0.xyz - worldPos * _WorldSpaceLightPos0.w;#else#ifndef USING_DIRECTIONAL_LIGHTreturn _WorldSpaceLightPos0.xyz - worldPos;#elsereturn _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_COMPILEreturn objSpaceLightPos.xyz - v.xyz * _WorldSpaceLightPos0.w;#else#ifndef USING_DIRECTIONAL_LIGHTreturn objSpaceLightPos.xyz - v.xyz;#elsereturn objSpaceLightPos.xyz;#endif#endif
}
// Transforms normal from object to world space
//把法线方向从模型空间转换到世界空间中
inline float3 UnityObjectToWorldNormal( in float3 norm )
{
#ifdef UNITY_ASSUME_UNIFORM_SCALINGreturn 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)中

不过现在好像换成了这种

Shader学习七,UnityCG.cginc相关推荐

  1. Shader学习笔记(三)学习Shader所需的数学基础

    感受高数 一.笛卡尔坐标系 1.二维笛卡尔坐标系 2.三维笛卡尔坐标系 二.点和矢量 1.矢量和标量的乘法/除法 2.矢量的加法和减法 3.矢量的模 4.单位矢量 5.矢量的点积 6.矢量的叉积(cr ...

  2. Shader学习12——简易图片叠加

    看到蛮牛有人想要两个带透明通道的图片叠加,就是最简单的纹理混合,想想其实实现起来应该很简单,但是搜了一下还真没搜到,这里简单实现一下,要求底图需要是不透明的: image.png image.png ...

  3. Unity Shader学习:动态模糊(shutter angle方式)

    Unity Shader学习:动态模糊 动态模糊一般有帧混合和motion vector两种,这里主要介绍motion vector的方法. Keijiro源码:https://github.com/ ...

  4. Shader学习2——兰伯特

    本以为写个兰伯特很简单,但是仔细考虑了一下,不光要受场景中光源影响,还需要受环境光影响,然后发现单个pass通道只能实现单光源.因此前期我们都只考虑单平行光. 兰伯特:漫反射颜色 = 光源颜色 x 材 ...

  5. Shader学习3——半兰伯特

    半兰伯特其实就是把暗的地方提亮了一些,在数值上就是获取到的光源强度* 0.5 + 0.5,也就是原来是0的会变成0.5,原来是1的还是1. 半兰伯特:漫反射颜色 = 光源颜色 x 材质的漫反射颜色 x ...

  6. Unity Shader学习:水墨效果

    Unity Shader学习:水墨效果 偶然在网上看到9级铁甲蛹大神的水墨风格后处理觉得挺有意思,参照着实现一下,还是涉及到之前油画效果的算法,叫什么滤波暂时不清楚,应该用来处理手绘效果挺多的. 水墨 ...

  7. Unity Shader学习:体积光/体积阴影

    Unity Shader学习:体积光/体积阴影 在前向渲染下实现平行光的体积光影效果,需要全屏深度图,延迟渲染会更划算. 思路:通过ray marching的步进点位置计算该点是否在阴影中,采样阴影贴 ...

  8. Unity Shader学习:SSR屏幕空间反射

    Unity Shader学习:SSR屏幕空间反射 本文在前向渲染模式下实现,延迟渲染更适合SSR,这里只简单的实现下,未作更深入的优化. 思路:沿视线和法线的反射向量步进光线,判断打到物体(这里用的是 ...

  9. Unity Shader学习:Dissolve消融效果

    Unity Shader学习:Dissolve消融效果 消融效果在游戏里非常常用,这里简单的实现下,代码里用到了if分支在shader里可能会费一点,如果想直接用puppet_master大佬版本的话 ...

最新文章

  1. 电脑中没有oracle服务器,用AnySQL在没有oracle客户端的服务器上发送邮件
  2. python 中的queue, deque
  3. liteos内核驱动和linux,移植RTOS必备基础知识
  4. ubuntu 16.04 安装QT问题
  5. coco与voc相互转化
  6. [Leedcode][JAVA][面试题 08.11][硬币][动态规划]
  7. 来了!云栖大会都能看到什么?
  8. java asynchronize_Java 中synchronize函数的实例详解
  9. 机器学习算法-随机森林初探(1)
  10. 【Elasticsearch】es mapper_parsing_exception
  11. POJ-2480 Longge's problem 欧拉函数
  12. select min from 连接
  13. php 横屏和竖屏,面试问题,视频横屏与竖屏的设计差异?我是这样回答的
  14. VMWare安装CentOS8及黑屏问题解决方法
  15. 第一课print()输出函数(包含心形图案代码)
  16. 查询-SPJ练习3参考答案
  17. Django项目使用QQ实现第三方登录
  18. MDS(多维尺度变换)
  19. linux系统硬盘坏了,linux 系统 如何检测 磁盘 是否损坏?
  20. 把数组里的字符串转换成数字或者把数字转换成字符串

热门文章

  1. Perl中的bless的理解
  2. 优化OpenSearch的搜索结果
  3. 嵌入式linux lvds,一种嵌入式主板实现双LVDS显示输出的电路及方法与流程
  4. 数码相框(三、LCD显示文字)
  5. IDEA项目发布中,Web Application:Exploded和Web Application:Archive的详细解释
  6. numpy之vstack()、hstack()
  7. Impala Shell 和 Impala SQL
  8. Photoshop插件-保存-8位通道-16位通道-脚本开发-PS插件
  9. word标题编号消失解决
  10. 最流行的微服务应用框架有哪些