love2d--glsl03噪声
由于一些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噪声的更多相关文章
- 在AD转换中的过采样和噪声形成
1. 直接量化的过采样AD转换 此类系统的模型可以用下图表示. 图中xa(t)是输入信号,e(t)是量化引入的噪声,xd[n]是最终得到的数字信号,包含分量xda和xde. 对于M倍过采样,信号与量化 ...
- 充分利用 UE4 中的噪声
转自:https://www.unrealengine.com/zh-CN/blog/getting-the-most-out-of-noise-in-ue4 UE4 推出基于材质的程序式噪声已经有一 ...
- 理解模数转换器的噪声、ENOB和有效分辨率
ADC的主要趋势之一是分辨率越来越高.这一趋势影响各种应用,包括工厂自动化.温度检测和数据采集.对更高分辨率的需求正促使设计者从传统的12位逐次逼近寄存器(SAR)ADC转至分辨率高达24位的Δ-ΣA ...
- 低噪声APD偏置电路
低噪声APD偏置电路 APD电源摘要:该电路产生并控制光通信中雪崩光电二极管(APD)的低噪声偏置电压.该可变电压通过控制APD的雪崩增益,优化光纤接收器的灵敏度特性.该电路采用低噪声.固定频率PWM ...
- ffmpeg编解码视频导致噪声增大的一种解决方法
一.前言 ffmpeg在视音频编解码领域算是一个比较成熟的解决方案了.公司的一款视频编辑软件正是基于ffmpeg做了二次封装,并在此基础上进行音视频的编解码处理.然而,在观察编码后的视频质量时,发现图 ...
- 用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)
图像画面中的噪声,大致可以分为两类:高斯噪声和椒盐噪声.在这里,我们先看下图像中两种噪声各自的特征. 椒盐噪声:噪声幅值基本相同,但出现位置随机. 高斯噪声:图像中每一点都存在噪声,但幅值是随机分布的 ...
- 均值滤波去除图像噪声的matlab程序
所谓均值滤波实际上就是用均值替代原图像中的各个像素值. 均值滤波的方法是:对待处理的当前像素,选择一个模板,该模板为其近邻的若干像素组成,用模板中的像素的均值来替代原像素. 优点:算法简单,计算速度快 ...
- [数字图像处理]常见噪声的分类与Matlab实现
1.研究噪声特性的必要性 本文的内容主要介绍了常见噪声的分类与其特性. 将噪声建模,然后用模型去实现各式各样的噪声. 实际生活中的各种照片的老化,都能够归结为下面老化模型. 这个模型非常easy,也能 ...
- perlin噪声
手贱去点了图形学里面的噪声课程,然后一个周末就交代在这上面了,还是有些云里雾里. 噪声就是给定一个输入变量,生成一个值在0~1范围内的伪随机变量的函数.在图形学中一般是输入一个坐标得到一个范围在0~1 ...
随机推荐
- 用C#实现木马程序
要实现木马服务的程序,主要实现以下几个功能:后台的运行(隐藏技术),控制码的接收与注册表的修改,下面对这三方面做介绍: 1.在VC#中,建立一个后台服务程序是很容易的,先建立一个新的C#的Window ...
- Asp.net 在网页编写C#代码示例-- 一个简单的web MsSql 命令执行环境
在给一个客户做的系统上,因为要对数据库进行查看,但之前都是用TeamView来连接到客户的服务器进行数据库操作的 但最近客户那边的TeamView好像更改过密码导致我无法正常连接,而巧了客户的网官因为 ...
- 《javascript高级程序设计》读书笔记(一)javascript简单介绍
第一章:javascript简单介绍 Netscape Navigator 开发的javascript Javascript的实现有三部分: 1.核心(ECMAScript):提供核心语言功能. ...
- AVAudioPlayer播放在线音频文件
AVAudioPlayer播放在线音频文件 一:原里: AVAudioPlayer是不支持播放在线音频的,但是AVAudioPlayer有一个 initWithData的方法:我们可以把在线音频转换为 ...
- Java网络编程-HTTP协议
HTTP协议的定义 这篇文章暂时不研究HTTP底层的TCP/IP的握手和挥手过程,只从表面的交互流程分析HTTP协议. HTTP英文全称是Hypertext Transfer Protpcol,也就是 ...
- JDBC-DAO经典模式 实现对数据库的增、删、改、查
JDBC(Java Data Base Connection)的作用是连接数据库 先看下jdbc连接SQLServer数据库的简单例子 代码实现(FirstJDBC): package com.jdb ...
- hunnu11546:Sum of f(x)
Problem description 令f(x)为x的全部约数之和,x的约数即能够被x整除的数.如f(24)=1+2+3+4+6+8+12+24=60),求 f(l) + f(l + 1) + ...
- Learn X in Y minutes Where X=c++
http://learnxinyminutes.com/docs/c++/ C++ is a systems programming language that, according to its i ...
- excel 获取中文拼音首字母
excel 获取中文拼音首字母 CreateTime--2018年5月31日08:50:42 Author:Marydon 1.情景展示 想要获取姓名的拼音首字母 2.实现方式 通过使用excel ...
- TypeScript 面向对象基础知识
孙广东 2016.4.5 JavaScript如今到处都是.web.server(通过NodeJS).移动应用(通过各种框架).全部这些,TypeScript都能够使用,而且能够为JavaScrip ...