一 shadertoy是什么

下面是维基百科上的定义:

Shadertoy.com is a cross-browser online community and tool for creating and sharing shaders through WebGL, used both for learning and teaching 3D computer graphics in a web browser

翻译成中文即shadertoy是一个在浏览器中教学3D图形学的在线社区和通过WebGL创建分享shader程序的工具。

从定义中可以看出,首先,shadertoy是一个在线社区,指的是shadertoy这个网站;其次,shadertoy是一个工具,这个工具是用来创建和分享shader程序的。

shadertoy 按字面意直接翻译过来就是着色器玩具。

二 怎么玩

既然shadertoy就是一玩具,那么要怎么玩呢?

首先,要明白的是shadertoy上我们编程的程序是pixel shader或者fragment shader,这个shader是用来计算屏幕上每个像素点的颜色的,以RGBA的形式输出给屏幕显示。

shadertoy社区上给了一个howto,对shadertoy中的函数接口和输入变量做了简单的介绍,此处只看图像着色器。

/*** fragColor 计算出的像素颜色* fragCoord 像素坐标*/
void mainImage( out vec4 fragColor, in vec2 fragCoord );// 计算每个像素的颜色/***常量定义*/
uniform vec3 iResolution;           // 窗口分辨率,单位像素
uniform float iTime;                // 程序运行的时间,单位秒
uniform float iTimeDelta;           // 渲染时间,单位秒
uniform float iFrame;               // 帧率
uniform vec4 iMouse;                // 鼠标位置
uniform vec4 iDate;                 // 日期(年,月,日,时)
...

新建一个shader,界面内容如下:

shader的默认代码如下:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{vec2 uv = fragCoord.xy / iResolution.xy;// 将坐标转换到0-1之间fragColor = vec4(uv,0.5+0.5*sin(iTime),1.0);// r,g位置绝对,b随时间变化。
}

可以看到,屏幕上的颜色,随着时间再不断变化。

修改代码如下:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{fragColor = vec4(1.0, 0.0, 0.0, 0.0);// 将输出颜色设置为红色
}

运行可见,屏幕都变成了红色,fragColor表示最终每个像素的颜色,其每个颜色分量rgba分别对用vec4的每个值。

再次修改代码,如下:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{fragColor = vec4(0.0, 0.0, 0.0, 1.0);// 将默认颜色设置为黑色// x坐标大于300的像素颜色设置为红色if (fragCoord.x > 300.0) {fragColor.r = 1.0;}
}

可以看到,一边红色一边黑色,点击全屏会发现,黑色的区域的宽度还是300,有时候这并不是我们想要的,我们希望黑色部分宽度的比例不变,修改代码如下:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{vec2 uv = fragCoord.xy/iResolution.xy;// 将坐标转换到0-1之间fragColor = vec4(0.0, 0.0, 0.0, 1.0);// 将默认颜色设置为黑色// x坐标大于0.3的像素颜色设置为红色if (uv.x > 0.3) {fragColor.r = 1.0;}
}

再次运行,不管是否全屏,黑色区域所占的比例还是这么多。

上面只是简单的修改了每个像素的颜色,就要使用图片来映射每个像素的颜色,通过channel随便选择一个张图,修改代码如下:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{vec2 uv = fragCoord.xy/iResolution.xy;// 将像素位置映射到0-1fragColor = texture(iChannel0, uv);// 获取纹理在uv出的像素颜色
}

纹理坐标的原点在左下角,取值范围是0-1,需要对坐标也做一次映射,可以看到图片就显示出来了。但是上面的全是静态的,如果我们想让画面有点变化,就需要用到iTime。修改代码如下:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{vec2 uv = fragCoord.xy/iResolution.xy;// 将像素位置映射到0-1vec4 fragColor = texture(iChannel0, uv);// 获取纹理在uv出的像素颜色fragColor.r = abs(sin(iTime));// 让红色分量的值随时间改变。
}

iTime表示程序运行的时间,对其求正玄值得到的结果可能为负值,因此还需要对这个值求绝对值。

参考:

珠玉在前,在学习的过程中下面这两篇文章对入门帮助很大,推荐一下:

  • 【ShaderToy】开篇——来自shader女神冯乐乐

  • A Beginner’s Guide to Coding Graphics Shaders——国外兄弟

shadertoy上手指南相关推荐

  1. Go Pro 半小时上手指南

    Jack刚买了台Go Pro 6,商品包装内没有说明书,希望尽快拍那种慢动作或者酷炫的照片,去网上看了些贴都是注重结果,很少讲具体设置或技巧,光靠自己研究什么时候才能入门?<Go Pro 半小时 ...

  2. android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LvKang-insist 链接:https://juejin.im/post/5efdff9d6fb9a07e ...

  3. 英雄探长的机器人怎么拼_LOL路人局都畏惧的辅助英雄,新版机器人布里兹上手指南...

    最近国服版本更新到9.9对这个所谓的机器人做了不小的改动,算是一波不错的加强,在此推出一篇上手指南,希望能帮助大家上分. 版本更新如下: 解析:坦度下滑,伤害提升,大招被动机制不在干扰我方ADC补刀, ...

  4. 「最简单」的 Core Data 上手指南

    本文讲的是「最简单」的 Core Data 上手指南, 原文地址:The Easiest Core Data 原文作者:Alberto De Bortoli 译文出自:掘金翻译计划 译者:Zheaol ...

  5. 分布式作业 Elastic-Job 快速上手指南

    转载自 分布式作业 Elastic-Job 快速上手指南 Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任 ...

  6. TortoiseGit + GitHub 快速上手指南

    TortoiseGit + GitHub 快速上手指南 名词解释: 1. TortoiseGit 是 TortoiseSVN的Git版,它很好的实现了与windows资源管理器的融合,使用界面与Tor ...

  7. raptor累乘流程图_Markdown快速上手指南

    Markdown快速上手指南 1.Markdown介绍 markdown可以实现快速html文档编辑,格式优没,并且不需要使用html元素. markdown采用普通文本的形式,例如读书笔记等易于使用 ...

  8. 最新课程 | openGauss 快速上手指南课程即将开课

    点击蓝字|关注我们 2020 年 7 月 1 日,openGauss 数据库源代码正式开放,并成立了 openGauss 开源社区.恩墨学院与 openGauss 开源社区达成合作,为了推动社区技术生 ...

  9. NexentaStor iSCSI/ NAS 存储服务器软件图解教程(3)——NMV快速上手指南Part2

    NexentaStoriSCSI/NAS 存储服务器软件图解教程(3) Nexenta Management View (NMV)/*NexentaStor Web 管理界面*/快速上手指南Part ...

最新文章

  1. 《Adobe Photoshop CC经典教程》—第1课1.2节使用工具
  2. 东师计算机应用基础在线作业,东师《计算机应用基础》15春在线作业1答案
  3. 阿里涉江:你真的会学习吗?从结构化思维说起
  4. 用上帝视角来看待组件的设计模式
  5. python xpath 中文乱码_Python爬虫实战 批量下载高清美女图片!让你们开开眼!
  6. csdn积分如何获取攻略
  7. 第二十五章 合作博弈论【相关策略与相关均衡】
  8. 程序员从月薪6k到15k,你知道这3个月我是怎么过来的吗?
  9. Stata:工具变量法(两阶段最小二乘法2SLS)——解决模型内生性
  10. 常见网络厂商Mib库文件
  11. 总结揭露黑客入侵网站的手法
  12. 系统运维应届生面试题
  13. 天呐!惊人的Springboot测试.Springboot测试类之@RunWith注解
  14. android系统开机logo定制
  15. 超小白用PANDA处理DTI数据的心酸历程笔记
  16. 使用D2RQ转换关系型数据库Mysql数据为RDF
  17. http://www.hi-donet.com/网站
  18. 带外通道技术(OOB)总结
  19. 毕业设计 嵌入式 扫地机器人系统
  20. floorplan 和 place的区别

热门文章

  1. Python 海龟绘图 100 题——第 72 题
  2. Abelssoft SSD Fresh Plus 2021 v10.06.31890 固态硬盘性能优化工具中文版
  3. 有道翻译 爬虫,分析反爬 附代码
  4. 2021-08-05 Vue+D3实现一个动态的流程图
  5. 【转】智力题解答汇总
  6. 出线资格 finals berth
  7. html页面中文显示乱码问题
  8. CSS样式自动换行(总结)
  9. 让Y40上的MAC启动更快
  10. 一个域名可以对应多个IP吗?如何通过DNS实现?