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 …

[html] input上传图片怎样触发默认拍照功能

[html] input上传图片怎样触发默认拍照功能 使用 capture 属性,capture 的值可以是:camera 打开摄像头user 打开前置摄像头environment 打开后置摄像头以上几个属性都不能保证设备会按照设置的一样打开前置或后置摄像头,如果设备不支持的话&…

|DataDirectory|的使用

Ado.net2.0中新增加了一个MagicValue,可以在应用程序的配置文件的数据库链接串种使用|DataDirectory| ,例如: <connectionStrings><add name"ConnectionString"connectionString"data source.;Integrated SecuritySSPI;AttachDBFilename|DataDirector…

腾讯云对象存储 python_python 云存储

广告关闭云服务器1核2G首年99年&#xff0c;还有多款热门云产品满足您的上云需求存储桶 bucketxml python sdk 存储桶名称由两部分组成&#xff1a;用户自定义字符串 和 appid&#xff0c;两者以中划线“-”相连。 例如 mybucket1-1250000000&#xff0c;其中 mybucket1 为用户…

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

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

[html] 举例说明Shadow DOM的应用场景有哪些?

[html] 举例说明Shadow DOM的应用场景有哪些&#xff1f; 可以将 shadow DOM 视为“DOM中的DOM”。它是自己独立的DOM树&#xff0c;具有自己的元素和样式&#xff0c;与原始DOM完全隔离。可以应用在组件中。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃…

Spring in Action 3 (翻译)

第一部分 Spring的核心 用Spring我们可以做很多工作。但是当你取其核心时你会发现&#xff0c;Spring最主要的特征就是依赖注入-DI&#xff08;Dependency Injection&#xff09;和面向切面编程-AOP&#xff08;Aspect Oriented Programming&#xff09;。在第一章“开始Sprin…

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

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

Mysql索引是有序的吗_mysql组合索引的有序性转

昨天同事关于军规里的一条mysql索引的问题咨询我&#xff0c;才发现自己也不太了解组合索引的规则。于是来记录一下&#xff1a;【推荐】如果有order by的场景&#xff0c;请注意利用索引的有序性。order by 最后的字段是组合索引的一部分&#xff0c;并且放在索引组合顺序的最…

工作405-关于vue组件开发过程中一直报错:This relative module was not found:

问题描述 在项目过程中&#xff0c;当我在路由映射表中添加url和对应组件时一直报This relative module was not found:这样的错误。检查了十几遍发现组件创建&#xff0c;导出&#xff0c;引入都没错&#xff0c;一时间心态崩了。 最后问题的解决 在看了二十几遍后才发现原来…

地址和指针的概念

地址和指针的概念转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/23/3846506.html

工作406- Error:Node Sass version 5.0.0 is incompatible with ^4.0.0 问题解决

Error:Node Sass version 5.0.0 is incompatible with ^4.x 问题解决 此错误来自sass-loader.因为node-sasslatest为v5.0.0,而sass-loader期望值为^4.0.0 目前解决方案如下&#xff1a; //卸载 node-sass npm uninstall node-sass //然后安装最新版本&#xff08;5.0之前&…

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

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

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

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

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

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

工作407-启动vue项目出现Module build failed (from ./node_modules/sass-loader/dist/cjs.js): ValidationError: I

This dependency was not found:* !!vue-style-loader!css-loader?{"sourceMap":true}!../../node_modules/vue-loader/lib/style-compiler/index?{"vue":true,"id":"data-v-ef68022e","scoped":true,"hasInlineConf…

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

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

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

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

Envi 4.7 破解安装及下载(转)

Envi 4.7下载&#xff1a;http://dl.dbank.com/c0xlwdke94安装Envi4.7时候如果提示需要license&#xff0c;那么按照如下步骤操作&#xff1a;1. 在License wizard 中选择"Install a license you have received"&#xff0c;点击"Next"2. 在Select a licen…

工作408- Module build failed (from ./node_modules/sass-loader/dist/cjs.js)

发现版本不对&#xff0c;于是执行npm uninstall sass-loadernpm install sass-loader7.1.0 --savenpm install style-loadernpm install node-sass安装对应的版本&#xff0c;搞定。