Unity Shader学习-单张纹理
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学习-单张纹理相关推荐
- 着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果
学习通过使用Unity Shader实现基础纹理的渲染效果 目录 学习通过使用Unity Shader实现基础纹理的渲染效果 问1:详细描述一下漫反射纹理.高度纹理.法线纹理.渐变纹理和遮罩纹理? 问 ...
- Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)
Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...
- 《Unity Shader入门精要》学习笔记第5章 开始Unity Shader学习之旅
本文章用于帮助自己学习,因此只记录一些个人认为比较重要或者还不够熟悉的内容. 原作者:http://blog.csdn.net/candycat1992/article/ 第五章 开始Unity Sh ...
- Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染
Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...
- Unity Shader学习-高光反射
Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...
- Unity Shader学习:SSAO屏幕环境光遮蔽
Unity Shader学习:SSAO屏幕环境光遮蔽 主要思路:1.随机采样像素法线半球周围的像素,平均对比与该像素深度是否处在暗处.2.双边滤波去噪点.3.后期AO图与原图混合. 原文链接:http ...
- Unity Shader学习:动态模糊(shutter angle方式)
Unity Shader学习:动态模糊 动态模糊一般有帧混合和motion vector两种,这里主要介绍motion vector的方法. Keijiro源码:https://github.com/ ...
- Unity Shader学习:水墨效果
Unity Shader学习:水墨效果 偶然在网上看到9级铁甲蛹大神的水墨风格后处理觉得挺有意思,参照着实现一下,还是涉及到之前油画效果的算法,叫什么滤波暂时不清楚,应该用来处理手绘效果挺多的. 水墨 ...
- Unity Shader学习:体积光/体积阴影
Unity Shader学习:体积光/体积阴影 在前向渲染下实现平行光的体积光影效果,需要全屏深度图,延迟渲染会更划算. 思路:通过ray marching的步进点位置计算该点是否在阴影中,采样阴影贴 ...
- Unity Shader学习:SSR屏幕空间反射
Unity Shader学习:SSR屏幕空间反射 本文在前向渲染模式下实现,延迟渲染更适合SSR,这里只简单的实现下,未作更深入的优化. 思路:沿视线和法线的反射向量步进光线,判断打到物体(这里用的是 ...
最新文章
- comparator 与comparable之间的关系 注意实现接口comparable<T>时候,T的取值为实现类的类型,眼高手低容易犯迷糊的地方提醒
- tf.name_scope()与tf.variable_scope()
- 转载:Django之Form组件
- 使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling
- [转]wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍
- ITFriend创业败局(四):菜鸟CEO的自我修养
- 【STC15库函数上手笔记】5、定时器
- react学习(58)--this.props进行父子传值
- 【今日CV 计算机视觉论文速览】Mon, 4 Mar 2019
- sqlserver如何启动数据库邮件
- ubuntu -- 安装最新版的nodejs
- NHibernate.3.0.Cookbook第三章第8节的翻译
- python删除第一行_python3.7 openpyxl 删除指定一列或者一行的代码
- 07向量的点积、数量积、两向量垂直的条件、投影与投影向量、向量的正交分解、几个不等式、用坐标计算数量积
- oppo 手机刷机和root,还有其他必备的刷机工具,需要请进!!!
- ET游戏框架之环境搭建与运行
- MSN 与六度分隔理论
- 斯年,愿做岁月的知音
- 飞凌单片机解密_芯片解密方法大全
- 无为职中计算机专业期中考试高一,无为县襄安高级职业中学