**shader入门精要(笔记1)**

正在整理中,很多网上找的,慢慢细化,先看一下一个物体的渲染流程

很明显,你所需要做的主要有两块代码,一个是顶点渲染,一个是片段渲染
在这里插入图片描述

 shader"likang/king05"//首字母大小写均可
    {
    	properties//首字母大小写均可
    	{
    		// 在inspector 面板显示的属性都写在这里
    	  _MainTex("baseTexture",2d) = "white"{}
    	}
    		//顶点着色器和片段着色器
    		//子着色器(SubShader):一个Shader可以有多个子着色器。这些子着色器互不相干且只有
    		//一个会在最终的平台运行。编写多个的目的是解决兼容性问题。Unity会自己选择兼容终端
    		//平台的Shader运行。
    		subshader
    	{
    	  pass
    	  {
    		  CGPROGRAM  //必须大写,不然会报错
    		  //cgprogram
    		  //指定了vertex和fragment programs的名字
    		  #pragma vertex vert  //vertex 不能大写  顶点着色器函数vert,#后面一般为函数包含,调用vert函数
    		  #pragma fragment frag   //fragment 不能大写   片段着色器函数frag
    		  #include "unitycg.cginc"  //引用库,包含很多辅助函数
    		  sampler2D _MainTex;  //纹理2D
    		  //不声明_MainTex_ST
    		  float4 _MainTex_ST; //纹理的缩放和偏移 就是Tiling/Offset 值(Tiling.x,Tiling.y,Offset.x,Offset.y)
    		  struct v2f//定义一个结构体,计算顶点数据
    		  {    //准备顶点数据
    			  //SV_POSITION 输出的数据结构包含了最终转换过的,将用于光栅化的顶点坐标
    			  //POSITION 转换之前的模型顶点坐标(自身坐标轴) 
    			  //模型顶点坐标要经过一系列的矩阵变换,最终变成屏幕上的像素坐标
    			  //回答是SV_前缀的变量代表system value,在DX10以后的语义绑定中被使用代表特殊的意义,和POSITION用法并无不



		  float4 pos:SV_POSITION;//POSITION为什么是float4而不是float3,是因为最后一维是W,xyzw,W指的是缩放,默认1
    			  float2 uv:TEXCOORD0; //第一张贴图的uv坐标  TEXCOORD1 第二张贴图的uv坐标
    			};
    		  //unity内置的常用数据结构
    		  //appdata_base 其含义就是输入到顶点着色器的数据(包含position,normal,one texture coordinate)
    		  //appdata_tan 输入到顶点着色器的数据(包含position,normal,tangent,one texture coordinate)
    		  //appdata_full 输入到顶点着色器的数据(包含position,normal,tangent,vertex color,two texture coordinates)
    		  //appdata_img 输入到顶点着色器的数据(包含position,one texture coordinate)
    		  v2f vert(appdata_base v)
    		  {
    			v2f o;//声明输出结构
    			//顶点数据矩阵变换投影到屏幕
    			// o.pos = UnityObjectToClipPos(v.vertex);等同于o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
    			//前者性能上优于后者,unity推荐使用前者
                //UNITY_MATRIX_MVP为unity内置的矩阵。该矩阵乘以顶点在模型坐标系下的坐标得到投影坐标
    			//类似的矩阵还有 UNITY_MATRIX_MV 模型坐标系(以模型某点为原点)-->观察者坐标系(以相机为原点)
    			//UNITY_MATRIX_VP 观察者坐标系-->投影坐标系
    			//UNITY_MATRIX_T_MV 转置模型-->观察者坐标系
    			//UNITY_MATRIX_TEXTURE0 to UNITY_MATRIX_TEXTURE3 纹理变换矩阵   等等……
    			 //mul(M,v) 矩阵与向量相乘 得到新的向量(模型坐标在投影坐标系下的新坐标)                                          
    			 o.pos = UnityObjectToClipPos(v.vertex);
    			 //UV在这里跟重复度和偏移做运算
    			 //TRANSFORM_TEX 函数的含义就是将顶点的uv坐标和Tiling和Offset做运算
    			 //因此你在shader属性中变化Tiling和Offset的值,纹理会发生改变
    			 o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
    			 //上面的等式等同于o.uv = v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;
    			 //所以上面要声明_MainTex_ST变量,不然这里会报错
    			 //如果采用默认的Tiling(1,1),Offset(0,0),那么在shader面板改变Tiling和Offset的值就没什么用了
    			  // o.uv = v.texcoord.xy;
    			 return o;
    		   }
    		  //将经过顶点着色器处理过的数据拿给片段着色器接着处理(给每个像素着色)
    		  //frag函数
    		  float4 frag(v2f i) :COLOR
    		  {
    			  //tex2D函数 CG内置函数:用来采样2d纹理
    			   float4 texCol = tex2D(_MainTex,i.uv);
    			   return texCol;
    			 }
    			 ENDCG
    				 //endcg
    			 }
    	}
    		fallback"diffuse"
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值