本文由@唐三十胖子出品,转载请注明出处。  
文章链接: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常见函数总结相关推荐

  1. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  2. Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...

  3. Unity Shader入门精要第四章:学习Shader 所需的数学基础--坐标空间

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.4.6.1 为什么要使用这么多不同的坐标空间 二.4.6.3 顶点的坐标空间变换过程 4.6.4 模型空间 4.6.6 观察空间 4 ...

  4. 《Unity Shader入门精要》笔记02 第1章+第2章

    基础篇 第1章+第2章 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正. 基础篇 ...

  5. 《Unity Shader 入门精要》读书笔记

    <Unity Shader 入门精要>读书笔记 --记录一下自己看书时遇到的一下困惑的地方和自己的一些想法,愿明天的我更加强大 1.要正确获得阴影和光照衰减效果,需要#pragma mul ...

  6. 《Unity Shader入门精要》笔记01 前言

    <Unity Shader入门精要>笔记01 前言 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发 ...

  7. Unity Shader入门精要学习笔记 - 第7章 基础纹理

    转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图"黏"在模型表面,逐纹素地控制 ...

  8. Unity Shader入门精要学习笔记 - 第14章 非真实感渲染

    Unity Shader入门精要学习笔记 - 第14章 非真实感渲染 本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1 ...

  9. Unity Shader入门精要学习笔记 - 第14章非真实感渲染

    转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...

最新文章

  1. 学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!...
  2. ExtAspNet应用技巧(十九) - 日志管理
  3. 2 年来,每个人最该感谢的,是坚持学习、用心分享的自己
  4. python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)
  5. 剑指OFFER之二维数组中的查找(九度OJ1384)
  6. 基于案例贯通 Spark Streaming 流计算框架的运行源码
  7. time模块及datetime模块常用方法讲解
  8. python nonetype object has no_为什么会出现这个?'NoneType' object has no attribute 'contet
  9. android math类,GitHub - Zihin/MathModeling-Android
  10. 联想计算机BIOS启动顺序boot,如何进入BIOS并更改启动顺序?
  11. BAPI:KBPP_EXTERN_UPDATE_CO, TCODE:CJ30/CJ40 第二部分
  12. 不写一行代码就能玩转 Kaggle 竞赛?
  13. 【CNN】94页论文综述卷积神经网络:从基础技术到研究前景
  14. Axure RP 8: 注册码(亲测可用)
  15. freeswitch安装
  16. 笔记:live2d4.0 sdk 博客园网页动画
  17. 图像处理-灰度图像转化为伪彩图像
  18. 从零开始理解Android下View(一)----学习笔记(参考郭霖大神博客)
  19. 移动端下拉刷新,兼容ios,Android及微信浏览器
  20. php校园学校宿舍管理系统 php毕业设计题目课题选题 php毕业设计项目作品源码(3)班主任和宿舍管理员功能

热门文章

  1. 关于优酷视频代码播放的若干事情……
  2. 2.1符号使用的不同场景2
  3. 又改考408了!杭州师范大学阿里巴巴商学院!
  4. C#基础 MethodInfo GetMethod 反射 调用无参公共方法
  5. idea提交项目到gitee
  6. 今天换个画风,来聊聊广告吧
  7. Python 一键吸猫!找出磁盘里所有猫照
  8. Ubuntu开启root登录
  9. 测试、预发布、生产环境测试时的侧重点是哪些?
  10. nutch_solr