Unity5.0 Shader 极简入门 (四)
来源:互联网 发布:淘宝新店铺有扶持吗 编辑:程序博客网 时间:2024/05/18 00:11
很久没写shader笔记了,最近一直在啃,刚刚有点新进度
这次来编写一个拥有两层UV通道的shader,通常第一层UV通道贴漫反射贴图,而第二层UV通道贴灯光贴图。
这里我制作了两种UV方案进行对比:两种方案的区别:
第一种:UV可以被平移,缩放操作。第二种UV不可以被用户平移缩放操作。
方案1
Shader "LiShader/mytest 1 "{ Properties { _MainTex ("Main Texture", 2D) = "white" {} _AOmap ("lightmap",2D) = "white"{} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { //CG语言开始 CGPROGRAM //像C#和java语言会有主函数main,这样程序运行的时候,先找主函数main运行,领起整个程序一样。 //shader也有主函数,但是是两个,一个顶点着色主函数,一个片元着色主函数。命名上自由一些,我们可以随便起名字 //我设置DingDianShader 是我的 顶点着色主函数。 #pragma vertex DingDianShader //PianYuanShader 是我的 片元着色主函数。 #pragma fragment PianYuanShader //然后倒入一个我们必须要用到的类,固定用法 #include "UnityCG.cginc" //初始化GPU前端数据,准备送给顶点着色处理器。获取语义类型如下:顶点位置,UV1通道,UV2通道,这些语义类型是专有名字死记硬背吧。 struct appdata { float4 fbxvertex : POSITION; float2 fbxuv : TEXCOORD0; float2 fbxuv2 : TEXCOORD1; }; //将顶点着色处理器的数据发送给片元着色器,发送的数据有如下:顶点位置,UV1通道,UV2通道 struct v2f1 { float4 Myvertex : SV_POSITION; float2 MyUV : TEXCOORD0; float2 MyUV2 : TEXCOORD1; }; //从内存中获取主贴图 uniform sampler2D _MainTex; //从内存中获取AO贴图 uniform sampler2D _AOmap; //需要一个内存空间来装UV1和UV2,声明这两个是为了对UV进行位移缩放操作。 float4 _MainTex_ST; float4 _AOmap_ST; //下面是顶点着色。 运行之后会将此环节的产物发送给片元着色,送进去的原料参数是appdata,到这里被命名为v v2f1 DingDianShader (appdata v) { //因为结构体中有成员变量,所以需要再次声明成员变量 v2f1 o; //下面开始GPU的顶点着色程序,这里我们并没有复杂的顶点计算,仅仅是直接继承而已,不做加工。 //UnityObjectToClipPos,固定用法,将物体坐标转成视口裁剪坐标 o.Myvertex = UnityObjectToClipPos(v.fbxvertex); //TRANSFORM_TEX 是专有名词,功能:将贴图谁使用哪层坐标在网格上面进行映射。 o.MyUV = TRANSFORM_TEX(v.fbxuv, _MainTex); o.MyUV2 = TRANSFORM_TEX(v.fbxuv2, _AOmap); //最后输出o,然后会被送给片元着色器。 return o; } //片元着色器是在最开始CG命令的时候定义的。 fixed4 PianYuanShader (v2f1 i) : SV_Target { fixed4 col = tex2D(_MainTex,i.MyUV) * tex2D(_AOmap,i.MyUV2) * 2.0; return col; } ENDCG } }}
方案2
Shader "LiShader/mytest 1 "{ Properties { _MainTex ("Main Texture", 2D) = "white" {} _AOmap ("lightmap",2D) = "white"{} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { //CG语言开始 CGPROGRAM #pragma vertex DingDianShader #pragma fragment PianYuanShader #include "UnityCG.cginc" struct appdata { float4 fbxvertex : POSITION; float2 fbxuv : TEXCOORD0; float2 fbxuv2 : TEXCOORD1; }; struct v2f1 { float4 Myvertex : SV_POSITION; float2 MyUV : TEXCOORD0; float2 MyUV2 : TEXCOORD1; }; uniform sampler2D _MainTex; uniform sampler2D _AOmap; //float4 _MainTex_ST;注释掉 //float4 _AOmap_ST;注释掉 v2f1 DingDianShader (appdata v) { v2f1 o; o.Myvertex = UnityObjectToClipPos(v.fbxvertex); //下面两句不同了 o.MyUV = v.fbxuv.xy; o.MyUV2 = v.fbxuv2.xy; return o; } fixed4 PianYuanShader (v2f1 i) : SV_Target { fixed4 col = tex2D(_MainTex,i.MyUV) * tex2D(_AOmap,i.MyUV2) * 2.0; return col; } ENDCG } }}
配上一些环境效果,气氛就会更好。
阅读全文
1 0
- Unity5.0 Shader 极简入门 (四)
- Unity5.0 Shader 极简入门(一)
- Unity5.0 Shader 极简入门 (二)
- Unity5.0 Shader 极简入门 (五)
- Unity5.0内置Shader解析
- Unity5.x Standard Shader在手机上的实现(四)
- Unity5 Compute && Geometry Shader
- Unity5 shader with lightmap
- Unity5中新的Shader体系简析
- Unity5 (5.0-5.2) Shader编译机制初探
- Unity Shader入门精要 阅读笔记四
- Shader 入门(一)
- Shader 入门(二)
- Unity5 (5.0-5.2) Shader编译机制初探 - 小心,Shader在吞噬你的内存
- Unity5中新的Shader
- Unity5中新的Shader
- Shader学习笔记(四)
- (四)Unity5.0新特性------音频混音器(转自官方博客)
- 1144. 陶陶摘苹果
- [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
- c++基础之字符串
- maven常用命令介绍
- ccf认证最优配餐80分
- Unity5.0 Shader 极简入门 (四)
- P1133 教主的花园
- point类求两点间的距离,点到原点的距离
- JZOJ 4714 公约数
- cuda & nvidia driver problems
- IIS7+php5.5环境搭建
- JavaScript:iframe子页面和父页面域内及跨域通信示例
- Java泛型之泛型概述
- [bzoj-1064] [Noi2008]假面舞会 题解