由于一些glsl的教程都是3d的,而love是2d的,所以之后以示例为主,我会收集

一些love的shader,分类讲解。

此文简译自love2d社区博客,这里略去作者的自我介绍。

像素着色器入门

示例1:

--屏幕大小是512x512
function love.load()
screen = love.graphics.newShader([[
vec4 effect(vec4 colour, Image image, vec2 local, vec2 screen)
{
//红绿颜色分量按纹理坐标比例缩放
vec4 screen_colour = vec4(screen.x / 512.0,
screen.y / 512.0,
0.0,
1.0); return screen_colour;
}
]]) texture = love.graphics.newShader([[
vec4 effect(vec4 colour, Image image, vec2 local, vec2 screen)
{
//红绿颜色分量随纹理坐标缩放
vec4 coord_colour = vec4(local.x, local.y, 0.0, 1.0);
//使用纹理中合适的像素
vec4 image_colour = Texel(image, local);
// 混合两种颜色
return mix(coord_colour, image_colour, 0.5);
}
]]) image = love.graphics.newImage("love-logo.png")
end function love.draw()
love.graphics.setShader(screen)
--下面绘制了三个三角形
love.graphics.polygon("fill", , , , , , )
love.graphics.polygon("fill", , , , , , )
love.graphics.polygon("fill", , , , , , ) love.graphics.setShader(texture)
love.graphics.draw(image, , , 0.5, , , 44.5, 44.5)
end

左边:像素着色器通过改变纹理坐标让纹理更多彩;x越靠近1,颜色越红;y越靠近

1,颜色越绿。右边:三角形的颜色由屏幕坐标确定,x越靠近屏幕宽,颜色越红;y

越靠近屏幕高颜色越绿(注意屏幕坐标y轴向上)

简单来说,像素效果是绘制时选择多边形每个像素的颜色和透明度的函数(当你绘制图像

时,实际上在绘制一个矩形,它每个像素的颜色和透明度已从图像数据里确定,这和绘制

颜色一样)。当前绘制的颜色、 屏幕像素的坐标、love程序本身都可以影响绘制效果; 如

果正在绘制Sprite,那么全部的图像数据以及像素纹理坐标都是可用的。

噪声简介

噪声是不可预测的数据,并在计算机图形学中用于生成类似自然的结构、 模式和纹理。通

过引入噪声,你可以创建没有明显重复的视觉效果或几何图案,也不需要预设的的纹理和

图片 ;也很容易产生动画效果。(附百度百科

在计算机图形学里最受欢迎的噪声是Perlin;它还常用于地形生成中,因为它可以产生随机

小山的外观。另一个是Worley 噪声,也被称为蜂窝噪声,因为它可以产生类单元格的外观。

    

左:统一值(值均匀)噪声        中: Perlin梯度噪声                   右:Worley 梯度噪声

在像素处理器里使用噪声

在love像素着色器里使用噪声并不难,网上有许多glsl的噪声例子,但我为你已经收集了大量

的例子。噪声通常以向量作输入因子;通常在空间维度,但你可以放任何你喜欢的东西,通过

添加额外的时间维,你可以创造非常好玩的动画。

--屏幕大小是512x512
function love.load()
--[[
-- 读入shader文件 原作是读文件,我这里直接放到字符串里
local perlin = love.filesystem.read("perlin2d.glsl")
]]
local perlin =[[
//
// GLSL textureless classic 2D noise "cnoise",
// with an RSL-style periodic variant "pnoise".
// Author: Stefan Gustavson (stefan.gustavson@liu.se)
// Version: 2011-08-22
//
// Many thanks to Ian McEwan of Ashima Arts for the
// ideas for permutation and gradient selection.
//
// Copyright (c) 2011 Stefan Gustavson. All rights reserved.
// Distributed under the MIT license. See LICENSE file.
// https://github.com/ashima/webgl-noise
//
//看到不认识的函数请查看glsl 1.2版手册的62页 //向量不能直接取余,这里定义了一个取余函数
vec4 mod289(vec4 x)
{
return x - floor(x * (1.0 / 289.0)) * 289.0;
}
//下面的一些运算都是向量运算,为什么这么计算,就只有
//查看相关的图形学了
vec4 permute(vec4 x)
{
return mod289(((x*34.0)+1.0)*x);
} vec4 taylorInvSqrt(vec4 r)
{
return 1.79284291400159 - 0.85373472095314 * r;
} vec2 fade(vec2 t) {
return t*t*t*(t*(t*6.0-15.0)+10.0);
} // 经典perlin噪声
float perlin2d(vec2 P)
{
vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
Pi = mod289(Pi); // To avoid truncation effects in permutation
vec4 ix = Pi.xzxz;
vec4 iy = Pi.yyww;
vec4 fx = Pf.xzxz;
vec4 fy = Pf.yyww; vec4 i = permute(permute(ix) + iy); vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
vec4 gy = abs(gx) - 0.5 ;
vec4 tx = floor(gx + 0.5);
gx = gx - tx; vec2 g00 = vec2(gx.x,gy.x);
vec2 g10 = vec2(gx.y,gy.y);
vec2 g01 = vec2(gx.z,gy.z);
vec2 g11 = vec2(gx.w,gy.w); vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
g00 *= norm.x;
g01 *= norm.y;
g10 *= norm.z;
g11 *= norm.w; float n00 = dot(g00, vec2(fx.x, fy.x));
float n10 = dot(g10, vec2(fx.y, fy.y));
float n01 = dot(g01, vec2(fx.z, fy.z));
float n11 = dot(g11, vec2(fx.w, fy.w)); vec2 fade_xy = fade(Pf.xy);
vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
return 2.3 * n_xy;
} // 经典perlin噪声,周期变化
float perlin2d_periodic(vec2 P, vec2 rep)
{
vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
Pi = mod(Pi, rep.xyxy); // To create noise with explicit period
Pi = mod289(Pi); // To avoid truncation effects in permutation
vec4 ix = Pi.xzxz;
vec4 iy = Pi.yyww;
vec4 fx = Pf.xzxz;
vec4 fy = Pf.yyww; vec4 i = permute(permute(ix) + iy); vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
vec4 gy = abs(gx) - 0.5 ;
vec4 tx = floor(gx + 0.5);
gx = gx - tx; vec2 g00 = vec2(gx.x,gy.x);
vec2 g10 = vec2(gx.y,gy.y);
vec2 g01 = vec2(gx.z,gy.z);
vec2 g11 = vec2(gx.w,gy.w); vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
g00 *= norm.x;
g01 *= norm.y;
g10 *= norm.z;
g11 *= norm.w; float n00 = dot(g00, vec2(fx.x, fy.x));
float n10 = dot(g10, vec2(fx.y, fy.y));
float n01 = dot(g01, vec2(fx.z, fy.z));
float n11 = dot(g11, vec2(fx.w, fy.w)); vec2 fade_xy = fade(Pf.xy);
vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
return 2.3 * n_xy;
} ]]
--把噪声函数和effect函数组合起来
noise = love.graphics.newShader(perlin .. [[
vec4 effect(vec4 colour, Image image, vec2 local, vec2 screen)
{
// 缩放屏幕坐标作为perlin噪声的参数
number noise = perlin2d(screen / 128.0); // 噪声范围-1--1,修正它为0--1
noise = noise * 0.5 + 0.5; return vec4(noise, noise, noise, 1.0);
}
]])
end function love.draw()
love.graphics.setShader(noise)
love.graphics.rectangle("fill", , , , )
end

尝试更多趣事

人们长期使用梯度噪声创造有趣的效果,网上又丰富的示例。我把收集了一些有趣的例子,你

可以快速的开始玩转。操作说明,用鼠标滚轮缩放、 按住右键平移,空格下一个效果, enter 键

模板开关。

  

左边:使用饱和 Worley噪音创建蓝色水波效果(在时间维中动画效果看起来很大) 。中间:绘制

模板多边形里的效果。右边:通过不断地添加缩放的 Perlin噪声可以创建烟熏效果。这种分形噪

声经常用于生成地形,因为它看起来类自然。底部:我在开发的游戏中,结合了前两种技术。

结论

像素效果不是太难学,噪声很容易产生详细而有趣的效果; 真正的难处是找到使用它的新方式。我

的噪声浏览器方便观察修改后的效果,你可以修改它来看可以得到什么。

注:非常感谢作者的辛勤劳动,前面的代码都可以用love2d 0.9运行,最后的“噪声浏览器",代码太多

我没修改,压缩包里已经附带了love 0.8版本。我的感觉shader不难,但用shader创造有趣的效果,需

要很多图形学和数学知识。对于我等小菜咋办,只有多多收集大神的shader了,在此上稍加修改,最好看

图形学和相关的数学知识。

此文所有代码下载地址,网盘

love2d--glsl03噪声的更多相关文章

  1. 在AD转换中的过采样和噪声形成

    1. 直接量化的过采样AD转换 此类系统的模型可以用下图表示. 图中xa(t)是输入信号,e(t)是量化引入的噪声,xd[n]是最终得到的数字信号,包含分量xda和xde. 对于M倍过采样,信号与量化 ...

  2. 充分利用 UE4 中的噪声

    转自:https://www.unrealengine.com/zh-CN/blog/getting-the-most-out-of-noise-in-ue4 UE4 推出基于材质的程序式噪声已经有一 ...

  3. 理解模数转换器的噪声、ENOB和有效分辨率

    ADC的主要趋势之一是分辨率越来越高.这一趋势影响各种应用,包括工厂自动化.温度检测和数据采集.对更高分辨率的需求正促使设计者从传统的12位逐次逼近寄存器(SAR)ADC转至分辨率高达24位的Δ-ΣA ...

  4. 低噪声APD偏置电路

    低噪声APD偏置电路 APD电源摘要:该电路产生并控制光通信中雪崩光电二极管(APD)的低噪声偏置电压.该可变电压通过控制APD的雪崩增益,优化光纤接收器的灵敏度特性.该电路采用低噪声.固定频率PWM ...

  5. ffmpeg编解码视频导致噪声增大的一种解决方法

    一.前言 ffmpeg在视音频编解码领域算是一个比较成熟的解决方案了.公司的一款视频编辑软件正是基于ffmpeg做了二次封装,并在此基础上进行音视频的编解码处理.然而,在观察编码后的视频质量时,发现图 ...

  6. 用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)

    图像画面中的噪声,大致可以分为两类:高斯噪声和椒盐噪声.在这里,我们先看下图像中两种噪声各自的特征. 椒盐噪声:噪声幅值基本相同,但出现位置随机. 高斯噪声:图像中每一点都存在噪声,但幅值是随机分布的 ...

  7. 均值滤波去除图像噪声的matlab程序

    所谓均值滤波实际上就是用均值替代原图像中的各个像素值. 均值滤波的方法是:对待处理的当前像素,选择一个模板,该模板为其近邻的若干像素组成,用模板中的像素的均值来替代原像素. 优点:算法简单,计算速度快 ...

  8. [数字图像处理]常见噪声的分类与Matlab实现

    1.研究噪声特性的必要性 本文的内容主要介绍了常见噪声的分类与其特性. 将噪声建模,然后用模型去实现各式各样的噪声. 实际生活中的各种照片的老化,都能够归结为下面老化模型. 这个模型非常easy,也能 ...

  9. perlin噪声

    手贱去点了图形学里面的噪声课程,然后一个周末就交代在这上面了,还是有些云里雾里. 噪声就是给定一个输入变量,生成一个值在0~1范围内的伪随机变量的函数.在图形学中一般是输入一个坐标得到一个范围在0~1 ...

随机推荐

  1. Android -- 利用Broadcast开启Service

    Broadcast和Service都是Android四大组建之一的. 这里的广播是动态的,自己注册的一个广播. 这种最典型的用法就是利用开机广播,然后再起自己的服务,也就是在Android手机中做到开 ...

  2. 检测任意日期字符串是否属于当天的java实现方案

    有时候我们会遇到很多形式的日期判断,甚至是并不常见的日期形式,比如20161212之类的日期,下面就此来进行代码是否处于当天的日期校验的代码实现来做一个整理. public static boolea ...

  3. 微软 Windows 10 将支持 8 英寸以下 ARM 平板设备

    2015 年 1 月 24 日,  9:32 下午 - 微软本周展示了 Windows 10 一系列新的改变,也包括首次公开展示的 Windows 10 手机版,但 ARM 平板并没有得到太多提及. ...

  4. CSS如何实现自定义鼠标应用到整个网页

    在CSS区把body改为*即可.但是注意Firefox不支持ani和cur文件,如果您一定想使用ani和cur的指针,可以试着将它改名为.gif文件.实际测试如果改为gif则IE也不支持了.

  5. 【数据压缩】LZW算法原理与源代码解析

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/50331883 <勿在浮沙筑高台> LZW压缩算法原理很easy,因 ...

  6. 你们对LinearLayout线性布局中Layout_weight的误解

    帮人找个入门级别的书得负责任,自己先看一下有无缺陷,结果发现这个:(原文发在该书的论坛上,发现受众面太小了,无奈转到这个弃用很久的博客里,以后把心得慢慢发上来) Google Android开发入门与 ...

  7. TCP客户/服务器程序实例——回射服务器

    目录 客户/服务器程序源码 POSIX信号处理 POSIX信号语义 处理SIGCHLD信号 处理僵死进程 处理被中断的系统调用 wait和waitpid函数 wait和waitpid函数的区别 网络编 ...

  8. QtGui.QPen

    The QtGui.QPen is an elementary graphics object. It is used to draw lines, curves and outlines of re ...

  9. VS下控制台执行保持(不要一闪而过)

    曾经上课的时候是用VC++6.0来学习编程的,编完打印出来的东西就直接显示在控制台上.而在Visual Studio下会出现控制台一闪而过的情况.这个问题事实上是非常好解决的.方法有多种.以下列举两种 ...

  10. 【Linux】less命令

    用途 less主要用于查看档案内容,与more的功能一致,但是比more更强大 全称 less的全称就为less 说明 空格键 :代表向下翻一页 pagedown : 代表向下翻一页 pageup:向 ...