小结
老规矩,继续了基础纹理的学习(shader入门精要 这本书真是新手福音,感谢乐乐学姐)。接昨天在世界坐标下计算法线纹理,今天继续了渐变纹理及遮罩纹理的学习。整体上来说,后面两种都算是法线纹理的一点小改动吧。现在尽量还是多跟着书上的代码敲一敲,多熟悉吧。今天还大概看了点,OGSL的内容,感觉明天得再去找本讲的细一点的书。稍微浏览了一下shadertoy上的大神作品。真是羡慕啊,感觉自己的进度还是太慢了,容易产生杂念,今天思想老是抛锚。
不过还是不能急,多年半途而废的经验告诉我,保持热情的方法就是(好吧我也不知道,但是急肯定是没用的)
至少今天比起昨天,我稍微能看懂shadertoy上的一两行了,还是有信心的。GOOD GOOD STUDY DAY DAY UP!
在看代码的时候发现,老是容易忘记定义的参数该如何使用。今天认真总结了这几天的代码,发现其实要在片元着色实现某些计算时,参数的使用往往都有一个基本模块。将每一个模块的参数使用时的代码,放到一起。这样阅读代码的时候,有条理多了,也更容易记住。
今日学习代码:
在世界坐标下的法线纹理实现

Shader “Unlit/bump mapping2”
{
Properties
{ _Color("Color Tint ",Color) = (1,1,1,1)
_MainTex(“MainTex”,2D) = “white”{} //模型纹理坐标
_BumpMap(“Normal Map”,2D) = “bump”{} // 法线纹理坐标。bump 内置法线纹理,默认为模型自带法线信息
_BumpScale(“BumpScale”,Float) = 1.0 // 控制凹凸程度,为0时,意味该法线纹理不会对光照产生任何影响
_Specular(“Specular”,Color) = (1,1,1,1)
_Gloss(“Gloss”,Range(8.0,256)) = 20
}
SubShader
{

     Pass{   Tags { "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "Lighting.cginc"#include "UnityCG.cginc"fixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;          //纹理属性(平铺,偏移系数)sampler2D _BumpMap;float4 _BumpMap_ST;          //同上float _BumpScale;            // 法系纹理对光照的反应程度fixed4 _Specular;float _Gloss;struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;float4 tangent:TANGENT;                  //将顶点的切线方向填充至tangent中(4个变量,w决定z方向)float4 texcoord:TEXCOORD0;               //纹理坐标};struct v2f{float4 pos:SV_POSITION;float4 uv:TEXCOORD0;                      //uv存放了两种纹理的坐标(模型,法线)float4 line1:TEXCOORD1;float4 line2:TEXCOORD2;float4 line3:TEXCOORD3;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);                     //裁剪空间下的顶点坐标o.uv.xy = v.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw;    //纹理属性ST变换o.uv.zw = v.texcoord.xy*_BumpMap_ST.xy + _BumpMap_ST.zw;     //法线纹理变换float3 worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;           //世界空间下的顶点坐标//计算从切线空间到世界空间的变换矩阵float3 worldNormal = UnityObjectToWorldNormal(v.normal);       //顶点法线float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);    //切线向量float3 worldBinormal = cross(worldNormal, worldTangent)*v.tangent.w;  //副法线向量// 将矩阵按行存储,第四位参数存放坐标o.line1 = float4(worldTangent.x,worldBinormal.x,worldNormal.x,worldPos.x);o.line2 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);o.line3 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);return o;}fixed4 frag(v2f i) : SV_Target{//准备纹理法线方向fixed4 packedNormal = tex2D(_BumpMap, i.uv.zw);      //对法线纹理采样fixed3 tangentNormal = UnpackNormal(packedNormal);  //将按像素方式存储的法线数据(),映射回法线数据tangentNormal.xy *= _BumpScale;                      // 切线及副法线乘以对光线的影响系数(控制凹凸效果)tangentNormal.z = sqrt(1 - saturate(dot(tangentNormal.xy,tangentNormal.xy)));  //计算切线空间中的法线//变换矩阵,将法线变换到世界空间下float3 tangentNormalToworld = normalize(half3(dot( i.line1.xyz, tangentNormal),dot(i.line2.xyz, tangentNormal),dot(i.line3.xyz, tangentNormal)));fixed3 albedo = tex2D(_MainTex,i.uv.xy).rgb*_Color.rgb;        // 获得纹素数据fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT * albedo; //环境光//准备入射光方向  视角方向float3 worldPos = float3(i.line1.w, i.line2.w, i.line3.w);fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPos));fixed3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));//计算漫反射,高光反射fixed3 diffuse = _LightColor0.rgb*albedo*max(0, dot(tangentNormalToworld,lightDir));//反射光(使用的是切线空间坐标系)fixed3 h = normalize(tangentNormalToworld + lightDir);fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(0,dot(tangentNormalToworld,h)),_Gloss);return fixed4(specular + ambient + diffuse, 1);}ENDCG
}}  Fallback "Specular"

}

渐变纹理实现
// Upgrade NOTE: replaced ‘_Object2World’ with ‘unity_ObjectToWorld’

// Upgrade NOTE: replaced ‘_Object2World’ with ‘unity_ObjectToWorld’

// Upgrade NOTE: replaced ‘mul(UNITY_MATRIX_MVP,)’ with 'UnityObjectToClipPos()’

Shader “Unlit/RampTEX”
{
Properties
{ _Color("Color Tint ",Color) = (1,1,1,1)
_RampTex(“RampTex”,2D) = “white”{} //模型纹理坐标
_Specular(“Specular”,Color) = (1,1,1,1)
_Gloss(“Gloss”,Range(8.0,256)) = 20
}
SubShader
{

     Pass{   Tags { "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "Lighting.cginc"#include "UnityCG.cginc"fixed4 _Color;sampler2D _RampTex;float4 _RampTex_ST;          //纹理属性(平铺,偏移系数)fixed4 _Specular;float _Gloss;struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;float4 texcoord:TEXCOORD0;               //纹理坐标};struct v2f{float4 pos:SV_POSITION;float3 worldNormal:TEXCOORD0;float3 worldPos:TEXCOORD1;float2 uv:TEXCOORD2;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);                     //裁剪空间下的顶点坐标o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;o.uv = TRANSFORM_TEX(v.texcoord,_RampTex);        //内置宏计算平铺和平移之后的纹理坐标return o;}fixed4 frag(v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed halfLambert = 0.5*dot(worldNormal, lightDir) + 0.5;           //半兰伯特模型,该部分的取值范围为【0,1】// 用半兰伯特模型构建一个纹理坐标并对渐变纹理(RampTex)采样,考虑到渐变纹理实质上只是一个一维纹理(纵轴不变)fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert, halfLambert)).rgb*_Color.rgb; //(漫反射系数)fixed3 diffuse = _LightColor0.rgb*diffuseColor;fixed3 halfDir = normalize(lightDir+viewDir);fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(0, dot(worldNormal, halfDir)), _Gloss);return fixed4(specular + ambient + diffuse, 1);}ENDCG
}}  Fallback "Specular"

}
**遮罩纹理实现
// Upgrade NOTE: replaced ‘mul(UNITY_MATRIX_MVP,)’ with 'UnityObjectToClipPos()’

Shader “Unlit/MaskTexure” //对高光部分进行遮罩处理
{
Properties
{
_Color(“Color”,Color)=(1,1,1,1)
_MainTex(“MainTex”,2D) = “white”{}

 //法线纹理部分_BumpMap("NormalMap",2D) = "white"{}_BumpScale("Bump scale",float)=1//高光反射部分_SpecularMask("SpecularMask",2D) = "white"{}_Specular("Specular",Color) = (1,1,1,1)_SpecularScale("SpecularScale",float) = 1_Gloss("Gloss",Range(8,256)) = 20
}SubShader{Pass{   Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"#include "Lighting.cginc"fixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;float _BumpScale;sampler2D _BumpMap;sampler2D _SpecularMask;float _SpecularScale;fixed4 _Specular;float _Gloss;struct appdata{float4 vertex:POSITION;float3 normal:NORMAL;float4 tangent:TANGENT;float4 texcoord:TEXCOORD0;};struct v2f{float4 pos:SV_POSITION;float3 LightDir:TEXCOORD0;float3 ViewDir:TEXCOORD1;float2 UV:TEXCOORD2;};v2f vert(appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.UV.xy = v.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw;TANGENT_SPACE_ROTATION;o.LightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;o.ViewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;return o;}fixed4 frag(v2f i) : SV_Target{    //将切线空间的入射光线及视角方向归一化,高光部分计算时使用fixed3 tangentLightDir = normalize(i.LightDir);fixed3 tangentViewDir = normalize(i.ViewDir);//获得切线空间下的法线方向(采样--反映射--解压缩)fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.UV));tangentNormal.xy *= _BumpScale;tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));//计算纹素及环境光fixed3 albedo = tex2D(_MainTex, i.UV).rgb*_Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT * albedo;//计算反射部分fixed3 diffuse = _LightColor0.rgb*albedo*max(0, dot(tangentNormal, tangentLightDir));//计算高光部分,注意添加了高光遮罩纹理的处理fixed3 halfDir = normalize(tangentLightDir+tangentViewDir);fixed specularMask = tex2D(_SpecularMask, i.UV)*_SpecularScale;fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(0, dot(tangentNormal, halfDir)), _Gloss)*specularMask;return fixed4(ambient+diffuse+specular,1);}ENDCG
}
}

}

**

2018.10.10相关推荐

  1. 计算机网络部分(共44题),2018年10月自考04741计算机网络原理试卷及答案

    2018年10月高等教育自学考试全国统一命题考试 计算机网络原理 试卷 (课程代码04741) 本试卷共5页,满分l00分,考试时间l50分钟. 考生答题注意事项: 1.本卷所有试题必须在答题卡上作答 ...

  2. 十月 android版本分布,安兔兔发布2018年10月份Android手机性能排行榜

    汽车行业有金九银十一说,手机行业同样也是如此.在刚刚过去的 10 月份,我们见证了多款国产旗舰手机的发布,包括Mate20 系列.小米MIX3.荣耀Mgaic 2.努比亚X等等,得益于强大的硬件配置, ...

  3. windows变量延迟_Windows 10的2018年10月更新可能推迟到11月(这就是原因)

    windows变量延迟 Microsoft stopped offering Windows 10's October 2018 Update on October 6, as it was dele ...

  4. ssl初一组周六模拟赛【2018.3.10】

    前言 先说一下成绩(因某人要求去掉了某人): 姓名 成绩 xjq 280 wyc 200(本人) lrz 200 zyc 100 hjq 40 lw 30 hzb 0 正题 题目1:Clocest ( ...

  5. 2018年10月17日普级B组【模拟赛】

    2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛 第一题--ISBN号码第一题--ISBN号码第一题--ISBN号码 博客链接: https ...

  6. 暑期训练日志----2018.8.10

    训练第12天. 上午光跑厕所了,没A几个题...下午晚上还可以... 这两天A的这几个题基本不用动脑子,看懂题了基本直接套模板就能出... 还有暴力枚举大法好... 2018.8.10

  7. android 跑分,2018年10月国内Android手机安兔兔跑分性能排行榜

    汽车行业有金九银十一说,手机行业同样也是如此.在刚刚过去的10月份,我们见证了多款国产旗舰手机的发布,包括Mate 20系列.小米MIX3.荣耀Mgaic 2.努比亚X等等,得益于强大的硬件配置,这些 ...

  8. 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)

    目录 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H) 竞赛事件相关 竞赛链接 竞赛题目 总结 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H) 竞赛事件相关 竞赛 ...

  9. 计算机网络原理201810自考,2018年10月自考04741计算机网络原理试卷及答案

    2018年10月高等教育自学考试全国统一命题考试 计算机网络原理试卷 (课程代码04741) 本试卷共5页,满分l00分,考试时间l50分钟. 考生答题注意事项: 1.本卷所有试题必须在答题卡上作答. ...

  10. 如何更新微软的html,如何升级微软2018 Windows 10更新四月正式版17134系统?

    微软已经正式发布了2018 Windows 10更新四月版系统,版本号是Build 17134,目前微软提供了多种升级途径,那么,如何升级微软2018 Windows 10更新四月正式版17134系统 ...

最新文章

  1. 测试CPU品牌和当前工作频率
  2. 关于ViewPager使用出现的图片覆盖错误问题
  3. CSV出力ボタンラッパー(asp.net)[イベントの作り方に役立つ]
  4. Linux中mysql的卸载和重装,在Linux下面卸载与重新安装Postgresql
  5. androidsdk里的android.bat和uiautomatorview.bat启动就闪退问题
  6. 链表根据主元切分成3段
  7. Oracle RAC 10.2.0.5升级到11.2.0.4遇到的问题
  8. 在SharePoint Server 2007中创建定制的用户管理模块
  9. OpenJDK8-u302-b03哪里去也?
  10. 架构与设计的流程和核心概念笔记:三、业务层设计
  11. TigerGraph集群安装
  12. android pc控制工具,电脑控制iPhone 或Android方法?透过这款工具就能实现
  13. 惠普HP LaserJet Pro M104a 打印机驱动
  14. 电子科大辅助挂课、秒挂(付费)
  15. 【关系抽取】TPLinker:单阶段联合抽取,并解决暴漏偏差
  16. 使用python创建NBA Shotchart
  17. 运维之阿里云和本地虚拟机的连接问题
  18. 超全汇总!多传感器离线/在线时空联合标定方法
  19. 程序员在十年后还会有现在的收入吗?
  20. Scrapy反爬与反反爬

热门文章

  1. MST1170,摩托车,电动自行车闪光器芯片
  2. 摩托车大功率闪光器MST1163
  3. 《七周数据分析师》总结
  4. android录像限制大小,uni-app 拍摄视频限制最大长度解决方案
  5. c++ inet_pton和inet_ntop在windows下用不了咋办?
  6. win10系统安装iso文件,绝对可下。
  7. hualinux0.10 网络篇:如何学好CCNA(网络入门的正确打开方式)
  8. ue4 改变枢轴位置_System Era Softworks如何利用UE4创作Astroneer的精彩宇宙
  9. 什么是VR虚拟展厅,VR虚拟展厅怎么做有什么功能?
  10. 在mysql中可以粘贴吗_现在我在学习MySQL,问问怎么复制粘贴数据库