【《Unity Shader入门精要》 提炼总结】(九)第九章·UV贴图纹理概念介绍单张纹理的应用Shader常见函数总结
本文由@唐三十胖子出品,转载请注明出处。
文章链接:https://blog.csdn.net/iceSony/article/details/84587428这篇文章将总结和提炼《Unity Shader入门精要》的第七章“基础纹理”的内容。
通过这篇文章,你可以知道
1)UV贴图概念与使用
2)纹理相关概念的介绍
3)简单的单张纹理的应用
4)前9章Shader常见函数总结
一.UV贴图概念与使用
虽然模型与贴图(包含UV贴图,法线贴图,渐变贴图,遮罩贴图)的制作是美工的活,但是程序需要知道相关的知识以及简单使用来进行shader的开发,其中最常见的修改就是下一章要涉及的法线贴图的shader开发。
上图来自网络,很明显这是个角色UV贴图,包含头部躯干四肢
首先美工在3Dmax制作模型导出的时候会有UV贴图的导出选项,美工需要进行模型的拆分
就像一个纸箱子,通过拆分会变成这样
UV贴图包含对模型上色的相关位置信息,之后可以在PS中进行相关上色修改
至于最终怎么穿上这层皮,是模型的事情:)
模型包含了与贴图的对应信息,本篇不涉及。
二.简单的单张纹理的应用
在以后的开发我们会用到上面那样的模型uv贴图,现在用简单的入门
左边是使用漫反射的模型,右边是使用了材质贴图的模型
在shader中我们需要获取纹理颜色在法线上的影响,并最终与漫反射颜色进行混合
由于是漫反射的替换,我们这里使用之前写过的漫反射顶点着色器举例
对之前代码我们进行了修改,首先修改结构体
struct a2v {float4 pos : POSITION;float3 normal : NORMAL;float4 texcoord:TEXCOORD0; }; struct v2f {float4 pos : SV_POSITION;float3 worldNormal : NORMAL;float2 uv : TEXCOORD0; };
v2f多添加uv属性,从a2v新添加的属性texcoord中转化
顶点着色器
v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.pos);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.uv = v.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw;return o; }
函数中添加一行o.uv = v.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw;
翻译过来就是: uv坐标=材质uv坐标*材质uv缩放+材质uv偏移
事实上在以后的开发中你会遇到这个函数TRANSFORM_TEX,本质也是这句话
片元着色器
fixed4 frag(v2f i) : SV_Target {float3 worldNormal = i.worldNormal;float3 worldLightDir = UnityWorldSpaceLightDir(worldNormal);float3 albedo = tex2D(_MainTex, i.uv).rgb;float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;float3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir)) * albedo;return fixed4(ambient+diffuse,1.0); }
函数中添加float3 albedo = tex2D(_MainTex, i.uv).rgb;
float3 diffuse=_LightColor0.rgb*_Diffuse.rgb*max(0,dot(worldNormal, worldLightDir))*halfLambert*albedo;
albedo的获取用到了tex2D函数对纹理进行采样,返回的albedo是该顶点下的材质颜色,在最后漫反射颜色结尾*albedo
完整代码如下
Shader "sony/Shader158" {Properties{_Diffuse("漫反射系数",Color) = (1.0,1.0,1.0,1.0)_MainTex("主纹理",2D) = "white"{}}SubShader{Pass{Tags{ "LightMode" = "ForwardBase" }CGPROGRAM#include "lighting.cginc"#pragma vertex vert#pragma fragment fragfloat4 _Diffuse;sampler2D _MainTex;float4 _MainTex_ST;struct a2v{float4 pos : POSITION;float3 normal : NORMAL;float4 texcoord:TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float2 uv : TEXCOORD2;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.pos);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.uv = v.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw;return o;}fixed4 frag(v2f i) : SV_Target{float3 worldNormal = i.worldNormal;float3 worldLightDir = UnityWorldSpaceLightDir(worldNormal);float3 albedo = tex2D(_MainTex, i.uv).rgb;float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;float3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir)) * albedo;return fixed4(ambient+diffuse,1.0);}ENDCG}} }
三.前九章Shader常见函数总结
坐标与法线的空间坐标转换
o.vert_pos = UnityObjectToClipPos(v.vert_pos);
o.normal = (mul(v.normal, (float3x3)unity_WorldToObject));
获取环境光颜色
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
获取光线方向,颜色
float3 lightDir = UnityWorldSpaceLightDir(o.vert_pos);
获取视角方向 normalize必须加
float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - o.normal);
获取反射光线方向
float3 reflectDir = -reflect(lightDir,o.normal);
UV坐标的设置与获取纹理信息
o.uv = v.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw;
float3 albedo = tex2D(_MainTex, o.uv).rgb;
获取纹理属性
Properties中定义了_MainTex ,那么在CGPROGRAM中声明为:_MainTex_ST
下一章我们会介绍低模变高模的神奇应用:法线纹理
Thanks♪(・ω・)ノ感谢阅读
【《Unity Shader入门精要》 提炼总结】(九)第九章·UV贴图纹理概念介绍单张纹理的应用Shader常见函数总结相关推荐
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
- Unity Shader入门精要第七章 基础纹理之遮罩纹理
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...
- Unity Shader入门精要第四章:学习Shader 所需的数学基础--坐标空间
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.4.6.1 为什么要使用这么多不同的坐标空间 二.4.6.3 顶点的坐标空间变换过程 4.6.4 模型空间 4.6.6 观察空间 4 ...
- 《Unity Shader入门精要》笔记02 第1章+第2章
基础篇 第1章+第2章 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正. 基础篇 ...
- 《Unity Shader 入门精要》读书笔记
<Unity Shader 入门精要>读书笔记 --记录一下自己看书时遇到的一下困惑的地方和自己的一些想法,愿明天的我更加强大 1.要正确获得阴影和光照衰减效果,需要#pragma mul ...
- 《Unity Shader入门精要》笔记01 前言
<Unity Shader入门精要>笔记01 前言 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发 ...
- Unity Shader入门精要学习笔记 - 第7章 基础纹理
转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图"黏"在模型表面,逐纹素地控制 ...
- Unity Shader入门精要学习笔记 - 第14章 非真实感渲染
Unity Shader入门精要学习笔记 - 第14章 非真实感渲染 本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1 ...
- Unity Shader入门精要学习笔记 - 第14章非真实感渲染
转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...
最新文章
- 学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!...
- ExtAspNet应用技巧(十九) - 日志管理
- 2 年来,每个人最该感谢的,是坚持学习、用心分享的自己
- python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)
- 剑指OFFER之二维数组中的查找(九度OJ1384)
- 基于案例贯通 Spark Streaming 流计算框架的运行源码
- time模块及datetime模块常用方法讲解
- python nonetype object has no_为什么会出现这个?'NoneType' object has no attribute 'contet
- android math类,GitHub - Zihin/MathModeling-Android
- 联想计算机BIOS启动顺序boot,如何进入BIOS并更改启动顺序?
- BAPI:KBPP_EXTERN_UPDATE_CO, TCODE:CJ30/CJ40 第二部分
- 不写一行代码就能玩转 Kaggle 竞赛?
- 【CNN】94页论文综述卷积神经网络:从基础技术到研究前景
- Axure RP 8: 注册码(亲测可用)
- freeswitch安装
- 笔记:live2d4.0 sdk 博客园网页动画
- 图像处理-灰度图像转化为伪彩图像
- 从零开始理解Android下View(一)----学习笔记(参考郭霖大神博客)
- 移动端下拉刷新,兼容ios,Android及微信浏览器
- php校园学校宿舍管理系统 php毕业设计题目课题选题 php毕业设计项目作品源码(3)班主任和宿舍管理员功能