Unity Shader学习-单张纹理

UV坐标

顶点UV坐标的范围一般都在[0,1]的范围内
Unity中的纹理坐标原点在左下角(0,0)

单张纹理

定义纹理属性

要给材质添加纹理,首先需要在Properties中定义一个纹理属性

Properties{_MainTex("MainTex",2D) = "white"{}
}

声明变量

然后需要在Pass中声明与属性类型相对应的变量

sampler2D _MainTex;
float4 _MainTex_ST;

除了_MainTex,还需要定义一个_MainTex_ST来存储纹理的缩放(Scale)和平(Translation)移,命名格式必须为纹理名_ST

定义结构体

struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;//存放纹理坐标float4 texcoord : TEXCOORD0;
};
struct v2f{float4 pos : POSITION;float3 worldNormal : TEXCOORD0;float3 worldLightDir : TEXCOORD1;//存放纹理坐标的uvfloat2 uv : TEXCOORD2;
};

光照计算

环境光

使用tex2D对纹理进行采样,得到纹素值,然后与定义的属性颜色进行混合,得到反射率,然后与环境光相乘得到环境光

fixed3 albedo = tex2D(_MainTex,i.uv) * _Color.rgb;
fixed3 ambient = UNITY_UNITYLIGHTMODEL_AMBIENT.xyz* albedo;

漫反射

漫反射计算要光源颜色,材质的颜色,同一坐标下的法线和光照方向
材质的颜色由纹理采样得到

fixed3 diffuse = _LightColor0.rgb * albedo.rgb * saturate(dot(worldNormal,worldLightDir));

高光反射

高光反射计算

fixed3 viewDir = normalize(UnityObjectSpaceViewDir(i.worldPos);
fixed3 halfDir = normalize(worldLightDir + viewDir);\
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(worldNormal,halfDir)),_Gloss);

最终光照计算

当物体与光源的光照进行计算的时候,由于物体有一个反射率,光照照射到物体上的时候,有一部分光会被物体吸收,与物体的反射率相乘可以得到反射的光线。
环境光和漫反射都会有一部分光线被吸收,而高光反射不会,所以前两者都需要与反射率做乘法运算得出最终的光照结果。
最后每个光照的运算结果相加得出最后的光照效果。
(个人查资料后得到的见解,如果不对欢迎留言,我这边及时改QAQ)

retunr fixed4(ambient + diffuse + specular,1);

完整代码

Shader "Custom/MySingleShader"
{Properties{_Color ("Color", Color) = (1,1,1,1)_MainTex ("Main Tex", 2D) = "white" {}_Specular ("Specular", Color) = (1,1,1,1)_Gloss ("Gloss", Range(8,256)) = 20}SubShader{Tags { "RenderType"="Opaque" }LOD 200Pass{Tags { "LightMode"="ForwardBase" }LOD 200CGPROGRAM#include "UnityCG.cginc"#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragfixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Specular;float _Gloss;struct a2v{fixed4 vertex : POSITION;fixed3 normal : NORMAL;fixed4 texcoord : TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;float2 uv : TEXCOORD2;};v2f vert(a2v v) : POSITION{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,_MainTex).xy;return o;}fixed4 frag(v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir =normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 albedo = tex2D(_MainTex,i.uv).rgb * _Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;fixed3 diffuse = _LightColor0.rgb * albedo *  max(0,dot(worldNormal,worldLightDir));fixed3 viewDir =normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 halfDir = normalize(viewDir + worldLightDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(worldNormal,halfDir)),_Gloss);return fixed4(ambient + diffuse + specular,1.0);}ENDCG}}FallBack "Diffuse"
}

Unity Shader学习-单张纹理相关推荐

  1. 着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果

    学习通过使用Unity Shader实现基础纹理的渲染效果 目录 学习通过使用Unity Shader实现基础纹理的渲染效果 问1:详细描述一下漫反射纹理.高度纹理.法线纹理.渐变纹理和遮罩纹理? 问 ...

  2. Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)

    Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...

  3. 《Unity Shader入门精要》学习笔记第5章 开始Unity Shader学习之旅

    本文章用于帮助自己学习,因此只记录一些个人认为比较重要或者还不够熟悉的内容. 原作者:http://blog.csdn.net/candycat1992/article/ 第五章 开始Unity Sh ...

  4. Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染

    Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...

  5. Unity Shader学习-高光反射

    Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...

  6. Unity Shader学习:SSAO屏幕环境光遮蔽

    Unity Shader学习:SSAO屏幕环境光遮蔽 主要思路:1.随机采样像素法线半球周围的像素,平均对比与该像素深度是否处在暗处.2.双边滤波去噪点.3.后期AO图与原图混合. 原文链接:http ...

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

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

  8. Unity Shader学习:水墨效果

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

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

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

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

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

最新文章

  1. comparator 与comparable之间的关系 注意实现接口comparable<T>时候,T的取值为实现类的类型,眼高手低容易犯迷糊的地方提醒
  2. tf.name_scope()与tf.variable_scope()
  3. 转载:Django之Form组件
  4. 使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling
  5. [转]wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍
  6. ITFriend创业败局(四):菜鸟CEO的自我修养
  7. 【STC15库函数上手笔记】5、定时器
  8. react学习(58)--this.props进行父子传值
  9. 【今日CV 计算机视觉论文速览】Mon, 4 Mar 2019
  10. sqlserver如何启动数据库邮件
  11. ubuntu -- 安装最新版的nodejs
  12. NHibernate.3.0.Cookbook第三章第8节的翻译
  13. python删除第一行_python3.7 openpyxl 删除指定一列或者一行的代码
  14. 07向量的点积、数量积、两向量垂直的条件、投影与投影向量、向量的正交分解、几个不等式、用坐标计算数量积
  15. oppo 手机刷机和root,还有其他必备的刷机工具,需要请进!!!
  16. ET游戏框架之环境搭建与运行
  17. MSN 与六度分隔理论
  18. 斯年,愿做岁月的知音
  19. 飞凌单片机解密_芯片解密方法大全
  20. 无为职中计算机专业期中考试高一,无为县襄安高级职业中学

热门文章

  1. 芭蕉树上第十五根芭蕉-- qt帮助文档使用
  2. php 0 加减乘除,php 加减乘除计算器 用php简单实现加减乘除计算器
  3. 硅谷最牛逼的50个天使投资人
  4. LINUX网卡地址配置
  5. 计算机网络之TCP最大连接限制
  6. ubuntu下 分辨率设置
  7. 有赞实时数仓建设实践与经验
  8. Scala中fold()操作和reduce()操作的区别
  9. scala reduce和Fold
  10. 手机刷入面具_小米手机机型怎么刷入脸谱Magisk模块详细教程