shadertoy上手指南
一 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上手指南相关推荐
- Go Pro 半小时上手指南
Jack刚买了台Go Pro 6,商品包装内没有说明书,希望尽快拍那种慢动作或者酷炫的照片,去网上看了些贴都是注重结果,很少讲具体设置或技巧,光靠自己研究什么时候才能入门?<Go Pro 半小时 ...
- android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南
code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LvKang-insist 链接:https://juejin.im/post/5efdff9d6fb9a07e ...
- 英雄探长的机器人怎么拼_LOL路人局都畏惧的辅助英雄,新版机器人布里兹上手指南...
最近国服版本更新到9.9对这个所谓的机器人做了不小的改动,算是一波不错的加强,在此推出一篇上手指南,希望能帮助大家上分. 版本更新如下: 解析:坦度下滑,伤害提升,大招被动机制不在干扰我方ADC补刀, ...
- 「最简单」的 Core Data 上手指南
本文讲的是「最简单」的 Core Data 上手指南, 原文地址:The Easiest Core Data 原文作者:Alberto De Bortoli 译文出自:掘金翻译计划 译者:Zheaol ...
- 分布式作业 Elastic-Job 快速上手指南
转载自 分布式作业 Elastic-Job 快速上手指南 Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任 ...
- TortoiseGit + GitHub 快速上手指南
TortoiseGit + GitHub 快速上手指南 名词解释: 1. TortoiseGit 是 TortoiseSVN的Git版,它很好的实现了与windows资源管理器的融合,使用界面与Tor ...
- raptor累乘流程图_Markdown快速上手指南
Markdown快速上手指南 1.Markdown介绍 markdown可以实现快速html文档编辑,格式优没,并且不需要使用html元素. markdown采用普通文本的形式,例如读书笔记等易于使用 ...
- 最新课程 | openGauss 快速上手指南课程即将开课
点击蓝字|关注我们 2020 年 7 月 1 日,openGauss 数据库源代码正式开放,并成立了 openGauss 开源社区.恩墨学院与 openGauss 开源社区达成合作,为了推动社区技术生 ...
- NexentaStor iSCSI/ NAS 存储服务器软件图解教程(3)——NMV快速上手指南Part2
NexentaStoriSCSI/NAS 存储服务器软件图解教程(3) Nexenta Management View (NMV)/*NexentaStor Web 管理界面*/快速上手指南Part ...
最新文章
- 《Adobe Photoshop CC经典教程》—第1课1.2节使用工具
- 东师计算机应用基础在线作业,东师《计算机应用基础》15春在线作业1答案
- 阿里涉江:你真的会学习吗?从结构化思维说起
- 用上帝视角来看待组件的设计模式
- python xpath 中文乱码_Python爬虫实战 批量下载高清美女图片!让你们开开眼!
- csdn积分如何获取攻略
- 第二十五章 合作博弈论【相关策略与相关均衡】
- 程序员从月薪6k到15k,你知道这3个月我是怎么过来的吗?
- Stata:工具变量法(两阶段最小二乘法2SLS)——解决模型内生性
- 常见网络厂商Mib库文件
- 总结揭露黑客入侵网站的手法
- 系统运维应届生面试题
- 天呐!惊人的Springboot测试.Springboot测试类之@RunWith注解
- android系统开机logo定制
- 超小白用PANDA处理DTI数据的心酸历程笔记
- 使用D2RQ转换关系型数据库Mysql数据为RDF
- http://www.hi-donet.com/网站
- 带外通道技术(OOB)总结
- 毕业设计 嵌入式 扫地机器人系统
- floorplan 和 place的区别