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. HOG特征原理及代码实现

    HOG特征原理 HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子. 它通过计算和统计 ...

  2. JavaScript之OOP

    本文介绍下js中OOP的一些用法: 由上图可得: 1.typeof null结果是object,所以需要用与运算符再次判断是否为空. 2.构造器实现重载后,可依序传入参数或传入对象. 由上图可得:要实 ...

  3. vncserver

    ## install packages yum install tigervnc-server xhost ## start vnc and xhost vncserver export DISPLA ...

  4. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:图像预处理完整样例

    import numpy as np import tensorflow as tf import matplotlib.pyplot as plt #随机调整图片的色彩,定义两种顺序. def di ...

  5. layer日期控件,开始时间不能大于结束时间

    var start=laydate.render({ elem: '#beginTime', //指定元素 type: 'month', format:'yyyy-MM', done:function ...

  6. 序列化模块ModelSerializer

    课程准备 配置:settings.py INSTALLED_APPS = [ # ... 'rest_framework', ] DATABASES = { 'default': { 'ENGINE' ...

  7. swift中的坑

    1.NSClassFromString //获取工程名称 let group = Bundle.main.infoDictionary let fileName = group?[kCFBundleE ...

  8. xianduanshu

    https://www.cnblogs.com/xenny/p/9739600.html ***************https://blog.csdn.net/shiqi_614/article/ ...

  9. 三十八、LNMP潮流组合搭建

    一.安装mysql 数据库 1.1  mysql数据库安装的三种方法: 1)编译安装,在lamp经典组合安装是5.1版本,是configure,make,make install,这里如果是5.5版本 ...

  10. ubuntu .bashrc文件添加jdk后无法登录的解决方案

    1. 快捷键(ctl-alt-f2)进入虚拟终端 2. 执行export PATH=/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/ ...