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 ...
随机推荐
- HDU 2897 邂逅明下 (博弈)
题意: 给你n.p.q,每次操作是令n减小 [p, q]区间中的数,当n < p时必须全部取完了,取完最后一次的人算输,问先手必胜还是必败. 解题思路: 这种非常类似巴什博弈,可以找出必胜区间和 ...
- html 中几次方,平方米,立方米.
m的n次方表示法:mn m<sup>n</sup> 10<sup>6</sup> m的n次方表示法:mn m<sub>n</sub&g ...
- html5图表
http://www.html5tricks.com/tag/html5图表
- 我的第一段ionic代码
ionic是基于angularjs的前端框架,用于实现移动app. 下面是第一段代码,先贴代码,有时间再整理: demo1.htm <!DOCTYPE html> <html ng- ...
- Tomcat 之 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099;
错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java. ...
- UNIX网络编程读书笔记:名字与地址转换
概述 在名字和数值地址间进行转换的函数: gethostbyname和gethostbyaddr:在主机名字与IPv4地址之间进行转换.仅仅支持IPv4. getservbyname和getservb ...
- 〖Linux〗使用ssh登录远程主机,并在本地打开远程图形界面
1. 修改/etc/ssh/sshd_config文件,设置允许TCP转发和X11转发 AllowTcpForwarding yes X11Forwarding yes 2. 登录无图形远程主机,并允 ...
- Android开发笔记(一百三十四)协调布局CoordinatorLayout
协调布局CoordinatorLayout Android自5.0之后对UI做了较大的提升.一个重大的改进是推出了MaterialDesign库,而该库的基础即为协调布局CoordinatorLayo ...
- 从缓存行出发理解volatile变量、伪共享False sharing、disruptor
volatilekeyword 当变量被某个线程A改动值之后.其他线程比方B若读取此变量的话,立马能够看到原来线程A改动后的值 注:普通变量与volatile变量的差别是volatile的特殊规则保证 ...
- JDBC 调用存储过程代码示例
曾经有过一个两层构架的时代,前台就是界面,后台就是存储过程,存储过程把业务逻辑和数据操作一手包办了. 用存储过程写东西比较复杂,大部分Java程序员或许都对此不太了解,因为我们如今的三层架构使用高级语 ...