hsv白色h值是多少_ShaderToy系列:HSV

2bd4e9ae806a6f3cafc49a46dd0136e4.png

前言

这次呢,继续再来看一个iq大神的简单作品,作品虽简单,但是却包含了很多知识点,先放上最终效果:

37333b6f31be2b79957b66f1e94d080c.png

ShaderToy地址:https://www.shadertoy.com/view/MsS3Wc

不过本篇改动较大,最终效果与ShaderToy上的已不太一致,这点请注意,不要因此产生困扰,本篇的核心主要在于探讨几种不同的HSV转换到RGB的方法。


色彩模式

色彩模式有很多种,每一种都有各自的用途,比如RGB用于计算机显示器的显示,CMYK用于纸张的印刷等等。

  • RGB

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

  • HSV/HSL

但是,RGB的方式对于人类来说,并不友好,比如我问你R(104)G(185)B(166)是个什么颜色,可能你需要想很久,甚至最后也不一定能正确回答出来,这不怪你,都是RGB的错〜

于是呢,计算机图形学研究人员在20世纪70年代设计出了一种更符合人类感知的色彩模式,这就是HSV与HSL,这两者类似但又有些区别。

HSV有时也被叫做HSB,其中的V与B表示的是亮度的意思。

a96e078ae66a138b07ee3f79123fb267.png

共同点:

  • 两者的色彩模型都可以用一个圆柱体来表示
  • 每个色调的颜色(色相)被排列在圆柱中呈放射状的圆形横截面上
  • 以圆柱中心为轴,从下到上为黑色到白色的过渡

不同点:

  • HSV表示法模拟了不同颜色混合在一起的方式,Saturation(饱和度)类似于当前颜色纯度与最大纯度的比值,范围[0,1],0时为灰色,Value(亮度)则是表示颜色与不同数量的黑色或白色的混合物。
  • HSL模型尝试类似于更感性的颜色模型,例如Natural Color System(NCS)或Munsell color system颜色系统,将完全饱和的颜色置于亮度值为1/2的圆周围,其中亮度值0或1分别为完全黑色或白色。

本文的重点,HSV,即H(hue色相)S(saturation饱和度)V(value亮度),通过定义一个颜色的色相,然后饱和度多少,最后亮度又是多少,即可得到我们所想要的颜色值。

有人问了,那既然HSV更符合人类感知,那为什么还要用RGB呢,能不能把RGB去掉呢?

那肯定是不能啦,因为显示器本身的硬件是通过RGB(红绿蓝)三色发光极来生成色彩的,HSV就相当于为了使我们人类更易懂而产生的一种中间语言!


效果实现

顶点着色器

顶点着色器,一始既往,没什么好说的,仅仅正确显示模型以及获取UV值即可。

v2f 

片断着色器

fixed4 

这个实例的片断着色器还是比较清晰易懂的,大体分析如下:

  1. 通过uv定义出hsv
  2. 分别利用此hsv实现三种HSV2RGB的效果
  3. 注释了前面两个,仅显示最后一个效果

HSV UV

大致理清思路后,我们来看细节实现

fixed3 

定义三维向量hsv,返回的值是由屏幕uv坐标组合而来HSV

  • H=i.uv.x
  • S=1
  • V=i.uv.y

也就是说屏幕的横向坐标表示的是色相H,垂直坐标表示的是亮度V,而饱和度S假设都是1的情况。

这个我们可以打开Unity中的拾色器,将色板切换到HSV模式下就可以直观的感受到这样分UV的用途了。

2ce9806b8d10bb79667c5cb7e9ce2d66.png

HSV2RGB(标准版)

fixed3 

根据我们上面的大体分析,这里主要是将我们的hsv通过自定义的函数hsv2rgb_01来转换成RGB颜色后的效果。

Wiki上的公式:

https://en.wikipedia.org/wiki/HSL_and_HSV

首先需先满足条件:

H ∈ [0º,360º]

S ∈ [0,1]

V ∈ [0,1]

然后直接上公式:

be1d97c44190ed05b6d65c9bf1cfabfb.png

翻译后的Shader代码如下:

fixed3 
注:公式中的h/60在代码中变成了h*6,原因是因为我们传进来的h并不是[0º,360º],而是[0,1],所以才需要*6来限定最终的结果在[0,5]之间.
注:switch仅支持#pragma target 3.5及以上

hsv2rgb_01返回的结果如下:

37333b6f31be2b79957b66f1e94d080c.png

效果刚好与我们上面在拾色器中看到的一样,横向表示色相,竖向表示亮度,而饱合度是1的情况。

HSV2RGB(替代版)

以上的版本虽然效果实现上没有问题,但是会产生一些性能与兼容性的问题,于是,在Wiki上还有一种替代方案,公式如下:

4f43fcc3cdbac1041f048ba131489f9f.png

套用公式,翻译成js语言:

function 

转换成shader后的代码:

fixed3 

返回的效果如下:

37333b6f31be2b79957b66f1e94d080c.png

与hsv2rgb_01效果一致,但是运算量更少,支持更低的SM版本。

HSV2RGB(优化版)

然而,我在ASE中发现了一版更优的版本,效果同样一致,运算量更少,代码如下:

float3 

总结

那么HSV转换RGB功能我们可以用在什么地方呢?

比如,我们可以用在后处理上,暴露HSV参数来方便直观的调节,然后内部转换成RGB,同样也可以用在一些角色材质的换色上等等。

最后

欢迎大家关注更多干货的公众号:Unity技术美术 ( ID:gh_8b69cca044dc )

c7fb98b0cc2a9f276b05d763a0d5bc55.png

Unity技术美术QQ交流分享群:19470667(1群已满)、763506271

b21ec0a0e4ed3e28a256a20a3488f896.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

saltstack mysql_saltstack学习五:return及入库_MySQL

return的用法网上太多资料了,利用return把结果存入数据库网上已经有现在的:1、在master端创建数据库:CREATE DATABASE saltDEFAULT CHARACTER SET utf8DEFAULT COLLATE utf8_general_ci;USE salt;---- Table structure for table jids--DROP …

mysql php 入门_PHP入门教程之PHP操作MySQL的方法分析

本文实例讲述了PHP操作MySQL的方法。分享给大家供大家参考,具体如下:设置Zend 软件所有 UTF-8 编码设置单个项目 UTF-8 的编码Demo1.phpheader(Content-Type:text/html; charsetutf-8;);//第一步,连接到 Mysql 服务器 3306//第二步参数&#…

and or not 优先级_快速划分测试用例优先级

在工程工期时间有限的情况下,怎么解决测试工期和全部测试用例执行时间之间的矛盾呢?怎么样的设计才能算测试用例引自:IEEE Standard 610 (1990):A set of test inputs, execution conditions, and expected results developed for a particular objectiv…

keil写文字怎么会乱码_主持稿怎么写才会吸引人

现在你是不是想要知道一个主持人它是怎么样把我们都吸引到节目当中来的,当然就是靠的主持稿了,那这个时候你就想要知道了,它应该要怎么写才会吸引人呢,最主要的一点就是需要我们一来就先声夺人,很多的优秀主持人都会这…

dropdownlist三级联动怎么实现_一张表实现三级联动

今天是七夕,七夕快乐,大家今天有没有人约呢?相信大部分的Access玩家都是玩Excel的高手,很多的功能在Excel中实现对大家来说都是小菜,比如今天要讲的联动。那么,我们现在就来讲一下在Access中怎么用一张表实…

Windows Phone开发(29):隔离存储C 转:http://blog.csdn.net/tcjiaan/article/details/7447469...

本文是隔离存储的第三节,大家先喝杯咖啡放松,今天的内容也是非常简单,我们就聊一件东东——用户设置。当然了,可能翻译为应用程序设置合适一些,不过没关系,只要大家明白,它就是用于保存我们的应…

go 函数名之前括号中的内容_2020 重学 Go 系列:09. 一篇文章理解 Go 里的函数

1. 关于函数 函数是基于功能或 逻辑进行封装的可复用的代码结构。将一段功能复杂、很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性。在 Go 语言中,函数可以分为两种:带有名字的普通函数没有名字的匿名函数由于 Go…

百度地图gif图标_华为手机误删照片怎么找回?手机怎么快速制作GIF动图

对于华为手机,国内的很多人群都是非常喜欢的,特别是哪些花粉们简直就是疯狂,但是当我们使用华为手机误删了照片应该怎么办?如何才能找回误删的照片?误删手机照片怎么找回?不用担心,下面就让我们…

mysql 获取结果_【原创】7. MYSQL++中的查询结果获取(各种Result类型)

在本节中,我将首先介绍MYSQL中的查询的几个简单例子用法,然后看一下mysqlpp::Query中的几个与查询相关的方法原型(重点关注返回值),最后对几个关键类型进行解释。1. MYSQL的查询实例下面的两个例子分别是STORE(所有数据一次性从服务器拉到本地…

C# Action

C# Action 的一般用法 最近在看汤姆大叔的JavaScript教程,总结的相当好,可惜自己功力尚浅不能把学到的融会贯通。看过今天大叔发的一篇博文,在js的回调函数中想到了一点关于Action的用法。 发一段简单不能在简单的程序 1 class Program 2 …

通过图片 找到桌面相同图片区域坐标_【Axure RP9原型案例】京东与淘宝的商品图片是如何被放大的...

摘要:在电商的商品详情页中我们经常会看到图片放大器的运用,我们以京东商品详情页为例来制作这样的原型效果。案例中综合运用了鼠标移入事件、鼠标移动事件,元件的移动、元件的显示/隐藏等交互动作。京东示意图观察交互首先我们观察京东详情页…

ref的mysql_ref:Mysql授权远程登陆

在Windows环境上操作。步骤如下:1. 打开cmd窗口,登陆mysqlmysql -uroot -p1234562.使用mysql数据库use mysql3.查看结果中host一行中是否有%,如果有%,此行用户名允许远程登录。下图所示,白色框中表示允许远程登录的账号&#xff1…

json格式校验并显示错误_使用postman做自动化接口校验

要想实现接口的自动化测试,需要以下几个步骤:自动登录首先点击postman左上角的new按钮,创建一个collection,在pre-request-scripts标签下,给整个collection创建一个公用规则编写登录脚本pre-request-scripts在请求发送…

powerbuilder提示不是下拉窗口_为什么过去状态管理不是问题?

2-tier 架构远古时期,状态是完全由数据库管理的。数据库提供的连接是有状态的,打开页面的时候开连接,页面上的改动直接提交到当前的数据库连接。数据库连接的状态就是页面状态。3-tier 架构后来因为互联网类型的应用的发展,数据库…

kali字典_kali黑客系统wpscan工具扫描wordpress漏洞入侵攻击测试教程

WPScan是Kali Linux默认自带的一款漏洞扫描工具,它采用Ruby编写,能够扫描WordPress网站中的多种安全漏洞,其中包括主题漏洞、插件漏洞和WordPress本身的漏洞。最新版本WPScan的数据库中包含超过18000种插件漏洞和2600种主题漏洞,并…

mysql df_MySQL主从复制实战

什么是主从复制使用两个或两个以上的数据库,一部分数据库当做主数据库,而另一部分数据库当做从数据库。系统在主数据库中进行写操作,从数据库记录在主库上所有的写操作,使得主从数据库的数据保持一致。一旦主数据库出现问题时&…