
Shader 入门笔记
从硬件开始讲起,到固定管线、顶点程序、片段程序Cg语言编写和实例编写
Potter
这个作者很懒,什么都没留下…
展开
-
Shader 学习一:Shader和渲染管线
原创 2016-02-26 23:11:46 · 1789 阅读 · 1 评论 -
Shader 学习二:Unity shader 的组织形式
surfaceShader是Pixel Shader和Vertex Shader 的封装,surfaceShader 的pass通道已经被封装了,所以没有pass部分。原创 2016-02-26 23:12:39 · 1332 阅读 · 0 评论 -
固定管线shader编写:基本属性
shader 部分介绍:properties:属性部分material:材质部分lighting: 启用光照(顶点光照)settexture : 设置贴图():表示一个固定值[]:表示一个属性值diffuse:材质的漫反射颜色,其实就是材质固有的颜色ambient:环境光specular:高光(光滑物体使用),必须添加separatespecularseparatespecular:独立镜面的高光原创 2016-02-26 23:19:55 · 1827 阅读 · 1 评论 -
Surface Shader
SurfaceOutput: input: lighting:光照 shadow:阴影 属性声明类型对应关系: Simpler2D-2D half-Rang fixed4-4元向量Tags {“RenderType”=”Opaque”} 描述一种渲染类型,Opaque:不透明的物体 LOD 200 :层级细节CGPROGRAM 开始 ENDCG 结束原创 2016-03-23 14:17:41 · 1209 阅读 · 0 评论 -
Cg入门1:输入输出和语义
知识点:1.顶点和片段程序的输入输出2.常用语义3.编写一个简单的Shader输入用:in输出用:out即使输入也是输出用:inoutCG语法:CGPROGRAM 开始标识ENDCG 结束标识objPos:语义 语义关键字必须为全大写字母组成(objpos:POSITION 语义:objpos表示一个位置向量),语义只是代表一种运行环境inout:表示可以把输入直接当成输出返回(顶点颜色输出c原创 2016-03-23 14:45:20 · 2606 阅读 · 0 评论 -
Cg入门2:profile和基本数据类型
float :一个浮点值float4:一个四阶向量half:一个浮点值的一半fixed:bool: 0 和 非0int: 其实也是按照float还计算的Sampler*:值传递不支持指针支持数组int 有符号全部静态变量没有逻辑运算符+?:可使用支持interface支持宏原创 2016-03-23 14:52:12 · 1624 阅读 · 0 评论 -
Cg入门3:数据类型和swizzle操作
知识点:1.向量2.Swizzle操作3.矩阵4.数组5.结构体结构体定义:结构体使用:比如:float4 f3=float4(0,1,1) ; swizzle:使用“.”来取值操作。可以用xyzw,也可以用rgba,但是xyzw和rgba不能同时使用。如:f3.xyrg 这样就错了特性1:利用swizzle取f3中的y值f3.y特性2:如果是取x,y 那么就是f3.xy特性3:如果想用f3原创 2016-03-23 14:55:30 · 2304 阅读 · 0 评论 -
Cg入门4:流程控制
知识点:1.If...else2.while3.Do...while4.forif-else,while,Do-while,for :与C语言语法一样switch/case : 不支持模型x,y 值范围:【-0.5,0.5】 起始位置为模型左下角注意:while、Do-while、for :循环上线为1024,只能循环1023此原创 2016-03-23 14:57:53 · 1421 阅读 · 0 评论 -
Cg 入门5:函数1
知识点:1.定制函数2.函数前向声明3.函数的传参4.Cg inClude注意事项:1.函数参数: 所有类型都是是传值传递2.函数数组参数:必须指定其维度代码和数据结构做成共用,然后includecube:从左下角开始,坐标x、y的范围都为 [-0.5,05]原创 2016-03-23 15:02:34 · 1518 阅读 · 0 评论 -
Cg入门6:函数2
内建函数分为四类:1.数学函数2.几何函数3.纹理函数4.导数函数:其实就是片段函数原创 2016-03-23 15:04:52 · 1335 阅读 · 0 评论 -
Cg入门7: Vertex Shader - 顶点数据的输入与输出
函数输出类型格式:类型 function(参数):语义注意:输入和输出同种类型语义,只能有一种,否则会报错TEXCOORD0:纹理坐标类型原创 2016-03-23 15:05:53 · 1680 阅读 · 0 评论 -
Cg入门9:Vertex Shader - Uniform 与 properties属性
_AppSetColor 声明处:可以在float4 _AppSetColor前面加Uniform ,或者不加都可以(注意:加的话好像,需要unity 5以上的版本)C# 代码原创 2016-03-23 16:13:38 · 1949 阅读 · 0 评论 -
Cg入门10:Vertex Shader - 几何变换 —MVP矩阵变换
Unity内建矩阵类型:M:世界矩阵V:摄像机矩阵P:投影矩阵T :矩阵的转置IT : 转置的的逆_Object2World: 模型到世界矩阵_World2Object:世界到模型矩阵MVP 矩阵变换:Shader DemoMVP 转置变换:C# demoMatrix4x4 mvp = Camera.main .projectionMatrix * Camera.main .worldToCame原创 2016-03-23 16:15:52 · 4117 阅读 · 0 评论 -
Cg入门11:Vertex Shader - 几何变换 —MVP矩阵变换(旋转、缩放)
旋转、缩放demoC# Code:Shader Code:原创 2016-03-23 16:17:11 · 2422 阅读 · 0 评论 -
Cg入门12:Vertex Shader - 几何变换 —顶点颜色变换
顶点颜色值获得物体坐标值范围:注意:取顶点数据最好用原始数据,v的vertex,虽然o.pos 也可以,但是是矩阵变换后的位置信息效果:由效果得出:物体坐标系,起始点为物体中心,范围为[-0.5,0.5]_SinTime:就是一个时间分向量,从[-1,1]的范围。顶点颜色值获得屏幕坐标值范围:由效果得出:屏幕坐标系,起始点屏幕左下角,范围为[-1,1]为什么没有产生颜色渐变,那是因为cube的顶点原创 2016-03-23 16:20:15 · 1918 阅读 · 0 评论 -
Cg入门13: Vertex Shader - 几何变换 —顶点位移
注意:向量进行计算的时候,不仅代表大小,还代表方向。记得代表方向有利于队变换计算的理解效果如下:原创 2016-03-23 16:21:45 · 1884 阅读 · 0 评论 -
Cg入门14:Vertex Shader - 几何变换 —顶点扭曲
mul (UNITY_MATRIX_MVP,upPos):参数说明由第一个参数UNITY_MATRIX_MVP 矩阵去影响第二个参数upPos向量(或者矩阵)Shader "Sbin/vf35" { SubShader { pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "U原创 2016-03-23 16:25:02 · 1900 阅读 · 0 评论 -
Cg入门15:Vertex Shader - 几何变换 —波
Shader "Sbin/vf36" { SubShader { pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f{ float4 pos : POSITION; float4 col : COLOR原创 2016-03-23 16:26:44 · 1678 阅读 · 0 评论 -
Cg入门16:Fragment shader - 片段级光照
将顶点程序实现漫反射放至片段程序后处理效果如下:看到和左边内建实现的漫反射一样了片段程序特点:1.采用三角面的形式渲染,而顶点程序是按顶点形式渲染注意事项:直接将计算好的顶点法线向量和光向量 直接传给片段程序使用效果如下:为啥不一样呢?顶点程序:1.按顶点计算,一个顶点一个顶点处理程序片段程序:1.先进行光栅化,把面片分割成三角形,2.一个片段程序,可以看成一个一个像素处理原因:1.由于面片程序,原创 2016-03-23 16:32:55 · 1603 阅读 · 0 评论 -
Cg入门17:Fragment shader - 片段级光照(添加阴影)
投射阴影方法一:添加一个单独的pass通道pass{ Tags{"LightMode" = "ShadowCaster"}}ShadowCaster:阴影投射器,可以投射阴影方法二:添加物体默认阴影投射FallBack "Diffuse"然后给光线开启阴影:效果如下:(效果图为添加平行光)如果要让我们的shader支持点光源阴影投射,就添加 FallBack "Diffuse"添加点光源后原创 2016-03-23 16:37:30 · 3081 阅读 · 0 评论 -
Cg入门18:Fragment shader - 边缘泛光和透明
泛光:处理后效果:透明:1.tags{"queue" = "transparent” } //调整渲染顺序2.blend srcAlpha oneMinussrcalpha //混合透明3. zwrite off //写入的z轴深度关掉关掉z轴深度与不关掉的区别:代码:Shader "Sbin/trans" { Properties {原创 2016-03-23 16:55:44 · 2731 阅读 · 0 评论 -
Cg入门19:Fragment shader - 片段级模型动态变色
y值要表示范围为[-0.5,0.5],所以语义要注意不要用Color(注意:Color 语义值范围为[0,1] )(特别注意:内建的cube范围才是【-0.5,0.5】,其他模型就不一定是这个值了噢)发现顶部没有融合掉,为了全部融合掉。我们将_Center范围+R的大小,就全部融合了效果如下:优化:去掉if else,因为if else 可能在其他硬件上不能执行。代码:Shader "Sbin/v原创 2016-03-23 17:00:12 · 1753 阅读 · 0 评论 -
Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)
Unity 一个面片的最大顶点数为65524,所以大于这个数,请拆分成多个面片1.获取汽车x轴的最大值和最小值[-2.5,2.5]+RsurfaceShader 语法surf :surface shader的方法名vert :使用顶点程序方法名surface shader 方法不能有返回值源代码:Shader "Sbin/SurfaceShader" { Properties { _Glos原创 2016-03-23 17:02:56 · 2694 阅读 · 0 评论 -
Cg入门21:Fragment shader - 2D纹理采样
体纹理:是啥?tex2D 以前只能在Fragment程序中纹理采样UV坐标系:其实点为左下角,范围为【0,1】,U为x轴,V为y轴Texture.wrapMode 循环模式:TextureWrapMode.Clamp:设置纹理充满拉伸使用TextureWrapMode.Repeat:纹理重复平铺使用如果采用Repeat,那么等于U>=1的情况就会用纹理图在右边在平铺一张图Texture.filte原创 2016-03-23 17:07:24 · 2625 阅读 · 0 评论 -
Cg入门22:Fragment shader - 2D纹理采样(光照贴图制作和使用)
一、光照贴图制作:实时光照效果:使用光照贴图步骤:1.选择要灯光贴图的模型,然后设置为Lightmap Static2.光源Baking设置为Baked3.选择Windows/Lighting,打开Lighting界面,1》选择Scene 选项卡,设置Ambient Gi为Baked2》选择LightMaps 选项卡,然后按Build,生成光照贴图数秒后LightMaps界面会显示光照贴图,效果如原创 2016-03-23 17:14:45 · 6256 阅读 · 0 评论 -
Cg入门27:Fragment shader – 程序纹理水波仿真
效果:Quad和Cube 波纹起始点为啥不一样了,返回都是[-0.5,0.5],坐标中心为模型中心。原因:估计模型网格数据的UV起始点是不一样的优化方案说明:由1-3逐渐增加,1和2配套使用优化方案1:开启单独线程,进行uv水波纹理计算源代码:Shader "Sbin/WaveAnimShader"{ Properties { _MainTex ("Texture", 2D) = "wh原创 2016-03-23 17:44:19 · 2703 阅读 · 3 评论 -
Cg入门26:Fragment shader –纹理混合动画
多张纹理混合,太多天空盒6张贴图 会动的星空效果湖面会动的星空效果只输出制定颜色通道colormask r //只准许输出红色 源代码:Shader "Sbin/BlendTexAnimShader"{ Properties { _MainTex ("Texture", 2D) = "white" {} _SecondTex ("Texture", 2D) = "white" {}原创 2016-03-23 17:40:44 · 2058 阅读 · 0 评论 -
Cg入门25: Fragment shader – UV动画(模糊)
疑问:偏导函数是什么?物理意义和几何意义?ddx():为x轴的偏导函数ddy():为y轴的偏导函数源代码:Shader "Sbin/FragmentAnimShader"{ Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma verte原创 2016-03-23 17:33:12 · 2206 阅读 · 0 评论 -
Cg入门24: Fragment shader – UV动画(波纹)
效果:源代码:Shader "Sbin/FragmentAnimShader"{ Properties { _MainTex ("Texture", 2D) = "white" {} _F("F",Range(1,30))=10 _A("A",Range(0,0.1))=0.01 _R("R",Range(0,1))=0 } SubShader { Pass {原创 2016-03-23 17:30:06 · 2637 阅读 · 0 评论 -
Cg入门23: Fragment shader – UV动画(序列帧)
让动画从1-9循环播放此纹理源代码:Shader "Sbin/FragmentAnim"{ Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #inclu原创 2016-03-23 17:27:53 · 2417 阅读 · 0 评论