Site Defunct

注意!截止到 16/9/2019 ,这个博客已经被搬迁到了 这里 。以后我的东西都会发在那里。拜拜啦!

GLSL 的各种着色器效果

GLSL 很牛逼

首先,我要说的是,GLSL 很牛逼。我知道大家都知道,但是今天我就来给大家展示一哈我为了我那个作业做的着色器(们),其中有很大一部分都是从 ShaderToy 上参考的!

Vignette

Vignette 我不知道咋翻译,他的中文是小插图?这也太奇怪了吧…… 但是总而言之,我们是可以知道 Vignette 的作用是可以让远离中心的地方(屏幕边缘)变黑,然后整个看起来就有点像 70 年代的电影一样的东西:

这个着色器一般在静物,或者是复古的六七十年代的东西的时候渲染起来效果很好。他的原理很简单,就是远离中心的就变黑:

vec2 uv = 1.0 - uv.yx;
float vig = uv.x * uv.y * 15.0; // 15.0 是 intensity
vig = pow(vig, 0.2); gl_FragColor = vec4(pixel * vig, 1.0);

其中,intensity 的作用就是让结果曝光,如果太大会过度曝光,而太小又会太暗。在 intensity 的下一行的 0.2 可以说是扩大范围,如果这个数字越大,暗的范围就越大。最后,用输出的像素和 vignette 值相乘就可以了。

ScanLine

ScanLine 就是扫描线。在老机器里面,扫描线经常是清晰可见的。现在由于科技呀,他进步了,扫描线就没了。但是假如还是为了这个美感的话,我们很容易用现代的,数学的方法把以前的 缺陷 给渲染出来。

实现 ScanLine 的方法有很多种。我这里用我自个儿的,其实不大高效,因为用了 if 。

vec2 realUV = vec2(uv.x * resolution.x, uv.y * resolution.y); // gl_FragCoord
pixel.rgb -= (
mod(realUV.y, 2.0) <= 1.0 ?
0.1 :
0.0
); gl_FragColor = vec4(pixel, 1.0);

这个贼明显,就是看看 realUV (gl_FragCoord) 的 y 值对 2 取余。如果是 1.0 的话,就直接把对应的像素哪一行 变暗

假如你喜欢的话,可以把 time 加上去,这样扫描线就会一直往下(上)移动:

vec2 realUV = vec2(uv.x * resolution.x, uv.y * resolution.y); // gl_FragCoord
pixel.rgb -= (
mod(realUV.y + ceil(time * <移速>), 2.0大专栏  GLSL 的各种着色器效果 class="p">) <= 1.0 ?
0.1 :
0.0
); gl_FragColor = vec4(pixel, 1.0);

你想扫描线移多快,就自个儿调移速吧。我觉得 20.0 还不错的。

实现扫描线的方法还有很多种。我找到的有 这种这种 ,还有 这种是我参考的做法

Pixelate

Pixelate 是像素化的意思。我 ShaderToy 上没找到,自个儿想的。如果有的话可以告诉我一哈,三克油!

我的做法其实很简单。我把屏幕分成比分辨率更小的小块,然后判断要渲染的点在哪个小块里头,对应采样那个小块的左上角的那个像素。(也就是强行下降分辨率):

vec2 realUV = vec2(uv.x * resolution.x, uv.y * resolution.y); // gl_FragCoord
vec2 fakeUV = floor(realUV / 8.0) * 8.0;
vec2 uv = fakeUV / resolution.xy;
vec4 pixel = texture2D(texture, uv);

可以看到,我们就是把真实坐标除了 8.0 以后,舍掉了一切的小数点,然后把他恢复成了原来的坐标。帅不?

Frosted Glass

还记得 Windows7 Aero 的酷炫毛玻璃效果吗?现在咱们也能大概实现它的效果啦!看回来我们的头图:

看到了吗?下面的对话框那里就是毛玻璃的效果。

其实毛玻璃的效果不难,就是瞎取样。这个来自 这里 。我们来看看:

float rand(vec2 uv) {
float a = dot(uv, vec2(92.0, 80.0));
float b = dot(uv, vec2(41.0, 62.0));
float x = (sin(a) + cos(b)) * 51.0;
return fract(x);
} void main() {
// ... 拿到 uv
vec2 rnd = vec2(rand(uv), rand(uv));
uv += rnd * 0.05;
gl_FragColor = texture2D(texture, uv);
}

rand() 可以说是一个伪随机函数吧?输入 uv ,然后通过 uv 和两个奇怪的向量点乘,并且把他们的正弦值和余弦值相加,然后放大 51 倍(这个可以改),最后舍弃掉整数部分,返回小数点后就可以了。回到 main 可以发现,结果被进一步减小了 - 为了不过分采样(就是离得太远)。这样就能让采样稍稍偏离原来的位置了!

当然,除此之外,其实你可以发现,假如不乘那个 51 ,然后点乘的那两个向量比较小的话 —— 就可以呈现出晶体的效果了:

帅不帅?快点儿去自己试试吧!

没了

上头就是我用的所有的着色器了。其实要模仿旧的 CRT 显示屏的话,这里还有:

玩得开心!

GLSL 的各种着色器效果的更多相关文章

  1. 编写Unity3D着色器的三种方式

    不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...

  2. 【Unity Shaders】Lighting Models —— 衣服着色器

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  3. 翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化

    翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化 翻译自: Exploring GLSL – Normal Visualizer with Geometry Shaders (Shader ...

  4. 在pixi中使用你的自定义着色器

    通过几天的学习,对openGL.shader有了一个大致的了解. 回到学习的初衷吧,在基于pixi.js重构D3项目的时候,因为精灵层级的问题,我得按照一定的先后顺序将不同类别的精灵添加到场景中去. ...

  5. three中的着色器示例

    其实在3D引擎/库的帮助下,我们做webgl开发的难度已经很大大地降低了,熟悉相关API的话,开发一个简单的3D程序可以说是很轻松的事情. 在我看来,webgl的核心就是着色器(顶点着色器.片元着色器 ...

  6. WebGL 着色器语言(GLSL ES)

    1.类型转换内置函数 转换/函数/描述 转换为整形数/int(float)/将浮点数的小数部分删去,转换为整形数(比如,将3.14转换为3) 转换为整形数/intl(bool)/true被转换为1,f ...

  7. [GLSL]着色器周记02——火焰特效 【转】

    http://www.cnblogs.com/tkgamegroup/p/4214081.html 这周学了好多.包括伪随机数.柏林噪声.先说伪随机数.伪随机数我们用的是周期函数而不是那种由前一项乘一 ...

  8. OpenGLES2.0着色器语言glsl

    OpenGLES2.0中是强制使用可编程的渲染管线的,使用的是glsl着色器语言,因为着色器语言是使用的GPU,即图形处理单元,而不是CPU,这样可以使CPU从繁重的几何计算和像素的处理中解脱出来了. ...

  9. OpenGL入门1.3:着色器 GLSL

    前言 经过之前一段时间的学习(渲染管线简介)我们已经知道了着色器(Shader)是运行在GPU上的程序,这些小程序为图形渲染管线的某个特定部分而运行,着色器只是一种把输入转化为输出的程序,着色器也是一 ...

随机推荐

  1. ZJNU 1542 - 三角形(续)--中高级

    从小到大排序后 先固定一遍,另外两边递增查找 即固定 i,j=i+1,k=j+1 然后让k递增到 a[i]+a[j]<=a[k] 时 此时不能凑成一个三角形 答案增加 k-1-j 组 此时不需要 ...

  2. JavaSE--【转】网络安全之证书、密钥、密钥库等名词解释

    转载 http://www.cnblogs.com/alanfang/p/5600449.html 那些证书相关的名词解释(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等 ...

  3. Linux进程的诞生和消亡

    1.进程的诞生 (1).进程0和进程1 (内核里边的固有的) (2).fork函数和vfork函数用于新进程的产生 2.进程的消亡 (1).正常终止和异常终止 (2).进程在运行时需要消耗系统资源(内 ...

  4. php安装swoole2.1.2

    准备环境: cos7.2  &   php 7.1.7 1.www.swoole.com找到对应版本2.使用git clone或则 wget 命令(下载后需解压)进行下载3.在swoole目录 ...

  5. 剑指offer【10】- 变态跳台阶

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) = 1 f(2) ...

  6. JS控制 input 输入字符限制全搜集

    ENTER键可以让光标移到下一个输入框 <input onkeydown="if(event.keyCode==13)event.keyCode=9" > 只能是中文 ...

  7. iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码

    iOS精选源码 APP启动视频 自定义按钮,图片可调整图文间距SPButton 一款定制性极高的轮播图,可自定义轮播图Item的样式(或只... iOS 筛选菜单 分段选择器 仿微信导航栏的实现,让你 ...

  8. 发生 Configuration system failed to initialize 错误的一个特例

    一般情况下,.net 程序启动时发生 Configuration system failed to initialize 错误, 大都与 config 文件中 <configSections&g ...

  9. vue项目打包,生成dist文件夹,如何修改文件夹的名字

    vue项目打包之后的dist文件目录是如下 如果想要修改dist或则static文件名称,需要打开config / index.js build: { // Template for index.ht ...

  10. s01字符串---蓝桥杯

    问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) 输出格式 n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定 0~ ...