Shader专题:卡通着色(一)控制颜色的艺术
什么是 Shader?
关于什么是 Shader ,各种百科各种教程都有说过,但是今天我们就从一个另一个角度去试着理解什么是 Shader?
我们先看下 Shade 的英文意思,如下:
v.给...遮挡(光线);把...涂暗
其中 把...涂暗 更贴近我们想要的意思。
所以:Shader 这个单词从字面上理解,就是把什么东西涂暗。
再强调一次:Shader 从单词字面上理解,就是把什么东西涂暗。
再强调一次:把什么东西涂暗的就是 Shader,就是着色器。
Shader 把什么涂暗了?
当然是游戏世界的各个物体,总所周知:有光明就有黑暗,有光照物体就有明暗对比,同时也会有阴影,而 Shader 之所以叫 Shader 是因为起初的时候,Shader 就是用来给物体增加明暗对比的,有了明暗对比,物体在游戏世界中就会更加立体,从而画面会更加真实。
所以 Shader 的作用就是给物体添加明暗对比。
Shader 为什么叫 Shader
当然以上纯属个人推测。现在 Shader 不止可以给物体添加明暗对比,而且还可以做很多滤镜效果,也可以做很多性能优化(比如减少包大小、减少图片内存等)的事情。
也许,一开始给 Shader 起名叫 Shader 的时候,Shader 功能非常有限,仅仅只是给物体添加明暗对比(也就是光照计算),后来由于硬件和软件的发展, 很多离线渲染(电影 CG)的算法都逐步应用在实时渲染(主要是 游戏 和3D 仿真等),Shader 能做的事情就越来越多,发展到今天,Shader 主要的功能并不只有光照计算。这样导致,在概念理解上给很多初学者增加了很多阻碍。
教练有一次听过一位搞图形学的朋友说:“我们搞实时渲染的都是那些搞视频(离线渲染)玩剩的”。
Shader 是着色器
什么是 Shader,中文叫做着色器,也就是给物体上色的意思,也就是说写 Shader 就是给物体上色的艺术。而这个上色不只是简单的色彩填充,而是涵盖了非常多的技巧(几何计算、颜色计算、贴图等)
所以中文的着色器,是一个非常精准的翻译。
群内的笑笑说了一个比较不错的说法:Shader 主要是光线数据作用在不同数据的物体上产生不同效果。
Shader 学习的顺序
不管是 Shader 还是其它某个科目,都有一些最常用、最简单的知识点。
而这些知识点很容易学以致用,也就是说,这种知识点,我们学习完了就能马上落地。
所以,教练要做的就是,把 Shader 中的知识点按照是否常用和是否简单这两个维度进行排列筛选,然后把它们一个个整理成案例,这样童鞋们的学习体验就会大幅上升。
主题式研究第三个阶段
- 第一个阶段:确定主题(关键字)
- 第二个阶段:搜索资料、搜索信息(搜集情报)
- 第三个阶段:构建知识体系(画脑图、写大纲)
到此,Shader 这个主题,我们目前已经到了第三个阶段,也就是构建知识体系的阶段。
当然,这一整篇,都再讲,我们要怎么怎么做,接下来干吗,并没有学习 Shader 的任何一个知识点。
那么今天就学习一点 Shader 知识意思一下。
颜色的控制
现有一张贴图,如下:

用来控制颜色的 shader 代码如下:
float4 frag (v2f i) : SV_Target
{
// 图片上每个像素的颜色值
float4 color = tex2D(_MainTex, i.uv);
// 返回颜色,表示将改像素的颜色值输出到屏幕上
return color;
}
我们只看方法中的代码,先不要在意一些细节。
虽然,我们没有 Shader 的语法学习经验,但是凭我们的 C# 经验,可以将上述代码推测个大概来。
首先 float4 是一个类型,可以存储 4 个 float 数值。而颜色一般都是由 r(red 红色)、g(green,绿色)、b(blue,蓝色)、a(alpha,透明度) 四个值控制。所以 float4 可以存储一个颜色。
现在,我们把图片中每个像素颜色重的红色值设置为 0,图片结果则如下所示:

代码如下所示:
float4 frag (v2f i) : SV_Target
{
// 图片上每个像素的颜色值
float4 color = tex2D(_MainTex, i.uv);
color.r = 0;
// 返回颜色,表示将改像素的颜色值输出到屏幕上
return color;
}
我们看到,图片变成了蓝绿色。
小结
Shader 是一门控制颜色的艺术,Shader 的核心也是如此。
在此篇,我们学习了 Shader 的两个重要知识点:
- float4 结构体
- 颜色的 rgb 控制
这两个知识点非常简单,也非常基础,但是是非常常用的两个知识点。
这片文章的内容就这些。
知识地图

相关下载:

转载请注明地址:liangxiegame.com
更多内容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
凉鞋的主页:https://liangxiegame.com/zhuanlan
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。
Shader专题:卡通着色(一)控制颜色的艺术的更多相关文章
- Unity3d shader之卡通着色Toon Shading
卡通着色的目的是为了让被着色物体显得过渡的不那么好,明暗交界线很明显,等等卡通风格的一系列特征, 也叫Non-photorealisticrendering非真实渲染 重点要做到两点: 1. 描 ...
- 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨) ...
- 【GLSL教程】(五)卡通着色 【转】
http://blog.csdn.net/racehorse/article/details/6641623 引言 卡通着色可能是最简单的非真实模式shader.它使用很少的颜色,通常是几种色调(to ...
- Unity Shader NPR 卡通渲染
卡通渲染的主要原理包含两个方面: 1.轮廓线的描边效果 2.模型漫反射离散和纯色高光区域的模拟 描边: 描边的实现方法采用将模型的轮廓线顶点向法线(或顶点)的方向扩展一定的像素得到.也可通过边缘检测( ...
- par函数col参数-控制颜色
col参数用来控制颜色,其实有一些列的颜色相关的参数,都是以col 开头 col : 控制图片中点,文字以及绘图边框的颜色,代码示例: par(col = "red") plot( ...
- ColorCtr控制颜色渐变
ColorCtr控制颜色渐变 public class ColorCtr : MonoBehaviour { public static global_color Instance; ...
- php面试专题---9、会话控制考点
php面试专题---9.会话控制考点 一.总结 一句话总结: 面向对象.设计模式这些特别好用,需要融会贯通 1.请写出PHP类权限控制修饰符? public.protected.private 2.p ...
- php面试专题---8、会话控制考点
php面试专题---8.会话控制考点 一.总结 一句话总结: 主要是cookie和session的区别,以及用户禁用cookie之后怎么使用session 1.为什么要使用会话控制技术? 因为http ...
- php面试专题---5、流程控制考点
php面试专题---5.流程控制考点 一.总结 一句话总结: 看代码不要先看函数里面的内容,要用的时候再去看:注意静态,注意变量作用域,php中的内置函数需要去归类总结,就是太容易忘记了 1.写出如下 ...
随机推荐
- 【Hadoop】mapreduce环形缓冲区
mapreduce过程解析 数据在map中怎么写入磁盘? 数据:经过map逻辑处理过后的数据(key,value)- 磁盘:本地磁盘 环形缓冲区 1.为什么要环形缓冲区? 答:使用环形缓冲区,便于写入 ...
- Java实现 蓝桥杯 算法训练 Lift and Throw
试题 算法训练 Lift and Throw 问题描述 给定一条标有整点(1, 2, 3, -)的射线. 定义两个点之间的距离为其下标之差的绝对值. Laharl, Etna, Flonne一开始在这 ...
- Java实现 LeetCode 692 前K个高频单词(map的应用)
692. 前K个高频单词 给一非空的单词列表,返回前 k 个出现次数最多的单词. 返回的答案应该按单词出现频率由高到低排序.如果不同的单词有相同出现频率,按字母顺序排序. 示例 1: 输入: [&qu ...
- Java实现 LeetCode 564 寻找最近的回文数(今天要GG在这道题了 头晕+题难(((φ(◎ロ◎;)φ))))
564. 寻找最近的回文数 给定一个整数 n ,你需要找到与它最近的回文数(不包括自身). "最近的"定义为两个整数差的绝对值最小. 示例 1: 输入: "123&quo ...
- java中ReentrantLock类的详细介绍(详解)
博主如果看到请联系小白,小白记不清地址了 简介 ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字 ...
- 分享一个新出炉的JVM里不痛不痒的BUG(Attach机制相关)
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 老早之前写过一篇文章,关于attach机制的,可以看下这篇老文章了解一下JVM源码分析之Attach机制实现完全解读,比如大家常用 ...
- mysql数据库运维方案
数据库不仅仅是dba的工作,每一个测试人员也应该懂得基本的数据运维操作,因为数据库是数据承载的地方并且是系统中非常重要的一部分,所以我们也需要熟练的对数据库进行基本维护. 01.常用备份恢复命令 第1 ...
- (九)不安全的HTTP方法
01 漏洞描述 <HTTP | HTTP报文>中介绍了HTTP的请求方法.在这些方法中,HTTP定义了一组被称为安全方法的方法:GET.HEAD.OPTIONS.TRACE,这些方法不会产 ...
- 对Activity启动模式的理解
对Activity启动模式的理解 应用场景 在已打开多个Activity应用B的前提下,应用A调用应用B后点击返回按钮,需要直接返回到A应用,而不是打开B应用的上一个Activity 一个Task可以 ...
- Windows环境下PHP安装pthreads多线程扩展
一.判断PHP是ts还是nts版 通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版. ...