【ShaderToy】抗锯齿相关函数
*示例代码可以直接在ShaderToy中运行。
*我放在这里咯ShaderToy基础学习中~欢迎交流(ノ>ω<)ノ
先上未抗锯齿的两个圆形图案,可以清楚看清图案边缘像素块,即“锯齿”。

附代码:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 r = 2.0*vec2(fragCoord.xy - 0.5*iResolution.xy)/iResolution.y;
vec2 center1 = vec2(-0.75,);
vec2 center2 = vec2(0.75,); vec3 bgcol = vec3(1.0,0.5,0.5);//bg color
vec3 col1 = vec3(0.4,0.6,0.6);//circle1
vec3 col2 = vec3(0.4,0.2,0.5);//circle2
vec3 pixel; pixel = bgcol; if(length(r-center1)<0.4)
pixel = col1; if(length(r-center2)<0.4)
pixel = col2; fragColor = vec4(pixel,1.0);
}
要消除锯齿,这里借助几个GLSL内置函数,下面一个一个做笔记QAQ:
①mix()函数
原型:
//x为下限,y为上限,a为权重
//mix函数返回以a为权重,(x,y)为范围的线性插值
//返回值计算公式:x ×(1−a)+y×a float mix(float x, float y, float a)
vec2 mix(vec2 x, vec2 y, vec2 a)
vec3 mix(vec3 x, vec3 y, vec3 a)
vec4 mix(vec4 x, vec4 y, vec4 a)
②clamp函数:
原型:
//返回值计算公式:
// min(max(x, minVal), maxVal)
//超出下界即等于下界
//超出上界即等于上界
float clamp(float x, float minVal, float maxVal)
vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal)
vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal)
vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal)
③smoothstep函数:
原型:
//在x、y间进行Hermite插值
//等价代码:
// genType t;
// t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
// return t * t * (3.0 - 2.0 * t); float smoothstep(float edge0, float edge1, float x)
vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x)
vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x)
vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x)
④step函数:
原型:
//step函数返回小于edge的值,否则返回1 float step(float edge, float x)
vec2 step(vec2 edge, vec2 x)
vec3 step(vec3 edge, vec3 x)
vec4 step(vec4 edge, vec4 x)
下面用一个简单明了的小例子来体现mix等函数的功能:

代码如下:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 p = fragCoord.xy / iResolution.xy;
vec3 col1 = vec3(1.0,0.2,0.4);
vec3 col2 = vec3(0.4,0.6,1.0);
vec3 pixel;
float m; //area 1
//展示用作示例的两种颜色
if(p.x<0.2){
if(p.y<0.5)
pixel = col1;
else
pixel = col2;
}
//area 2
//step函数效果
else if(p.x<0.4){
m = step(0.5,p.y);
pixel = mix(col1,col2,m); }
//area 3
//根据纵坐标数值线性变化效果
else if(p.x<0.6){
m = p.y;
pixel = mix(col1,col2,m);
} //area 4
//clamp函数效果
else if(p.x<0.8){
m = clamp(p.y,0.4,0.8);//即将线性变化区间从完整的[0,1]变成[0.4,0.8]
pixel = mix(col1,col2,m);
}
//area 5
//smoothstep函数效果
else{
m = smoothstep(0.45, 0.55, p.y);
pixel = mix(col1,col2,m);
}
//区域分界线
for(float i=0.2;i<1.0;i += 0.2){
if(p.x<i&&p.x>i-0.005)
pixel = vec3(1.0);
} fragColor = vec4((pixel),1.0);
}
回到最初的圆形。
用上述函数对原始圆形图案进行处理,弱化锯齿:

附代码:
float linearstep(float edge0, float edge1, float x) {
    float t = (x - edge0)/(edge1 - edge0);
    return clamp(t, 0.0, 1.0);
}
float smootherstep(float edge0, float edge1, float x) {
    float t = (x - edge0)/(edge1 - edge0);
    float t1 = t*t*t*(t*(t*. - .) + .);
    return clamp(t1, 0.0, 1.0);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 r =  2.0*vec2(fragCoord.xy - 0.5*iResolution.xy)/iResolution.y;
    vec3 bgcol = vec3(1.0,0.3,0.5);//bg color
    vec3 col1 = vec3(0.4,0.2,0.5);//circle
    vec2 center1 = vec2(-1.35,);
    vec2 center2 = vec2(-0.45,);
    vec2 center3 = vec2(0.45,);
    vec2 center4 = vec2(1.35,);
    vec3 pixel = bgcol;
    float m=0.4;
    pixel = bgcol; 
    //circle 0
    //未经任何处理
    /*
    if(r.x<-0.9){
        if(length(r-center1)<m){
            pixel = col1;
        }
    }
    */
    //circle 1
    //step处理,等同于未经任何处理的circle 0
    if(r.x<-0.9){
        m =  step(m,length(r-center1));
        pixel = mix(col1,bgcol,m);
    } 
    //circle 2
    //linearstep处理
    else if(r.x<-0.0){
        m =  linearstep(m-0.005,m+0.005,length(r-center2));
        pixel = mix(col1,bgcol,m);
    }
    //circle 3
    //smoothstep处理
    else if(r.x<0.9){
           m =  smoothstep(m-0.005,m+0.005,length(r-center3));
        pixel = mix(col1,bgcol,m);
    }
    //circle 4
    //自定义smootherstep处理
    else if(r.x<1.8){
           m =  smootherstep(m-0.005,m+0.005,length(r-center4));
        pixel = mix(col1,bgcol,m);
    }
    //区域分解线
    for(float i=-0.9;i<2.0;i += 0.9){
        if(r.x<i&&r.x>i-0.005)
            pixel = vec3(1.0);
    }
    fragColor = vec4(pixel,1.0);
}
上图可能不太明显,在shadertoy网站运行代码全屏会更清楚点。事实是从左到右四个图的圆形锯齿越来越不明显。
这里有段代码蛮有意思的:
float t = (x - edge0)/(edge1 - edge0);
return clamp(t, 0.0, 1.0);
第一行代码的作用是判断x和edge1之间的关系,结合第二行clamp函数,如果>1说明x>edge1;如果<1则反之。
【over.】
【ShaderToy】抗锯齿相关函数的更多相关文章
- 【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)
		写在前面 在之前的基础篇中,我们讲到了在绘制点线时如何处理边缘的锯齿,也就是使用smoothstep函数.而模糊参数是一些定值,或者是跟屏幕分辨率相关的数值,例如分辨率宽度的5%等等.但这种方法其实是 ... 
- SSE图像算法优化系列二十四: 基于形态学的图像后期抗锯齿算法--MLAA优化研究。
		偶尔看到这样的一个算法,觉得还是蛮有意思的,花了将近10天多的时间研究了下相关代码. 以下为百度的结果:MLAA全称Morphological Antialiasing,意为形态抗锯齿是AMD推出的完 ... 
- Android 抗锯齿的两种方法
		Android 抗锯齿的两种方法 (其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true)) 在Android中,目前,我知道有两种出现锯齿 ... 
- Linux 下 netbeans 字体抗锯齿正解
		转自:http://leenjewel.blog.163.com/blog/static/601937922010124444051/ 说来这个不难,主要是我看网上有的写的不是很明确,甚至有的写的根本 ... 
- CSS抗锯齿 font-smoothing 属性介绍
		CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ... 
- PHP合成图片、生成文字、居中对齐、画线、矩形、三角形、多边形、图片抗锯齿、不失真 高性能源码示例
		function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( ... 
- Unity抗锯齿
		Unity抗锯齿设置是针对模型,对模型的阴影的锯齿设置无效,不知道我这样的理解是否正确. 遇到的问题 而我是要对灯光照射在模型上产生的阴影进行抗锯齿,暂时还未研究出解决方案,希望知道的朋友告知一声. ... 
- 106、抗锯齿方法paint.setAntiAlias(ture);paint.setFilterBitmap(true))
		在Android中,目前,我知道有两种出现锯齿的情况. ① 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿. ② 在用View的RotateAnimation做动画时候 ... 
- CSS抗锯齿 font-smoothing
		CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ... 
随机推荐
- iOS 多线程 NSOperation、NSOperationQueue
			1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ... 
- DES加密算法应用:分组加密模式
			通常,大多数的分组加密算法都是把数据按照64位分组的方式进行加密和解密.但是几乎所有的加密工作所涉及的数据量都远远大于64位,因此就需要不断地重复加密过程,直到处理完所有的分组.这种分组加密中所涉及的 ... 
- Win7系统下,docker构建nginx+php7环境实践
			前面两章介绍的是Windows系统下如何安装和配置docker,主要原因在于,公司大多人数用的是Windows环境,想通过在Windows环境上,通过docker,构建一个公用的配置. 首先要说明的是 ... 
- Robust Principal Component Analysis?(PCP)
			目录 引 一些微弱的假设: 问题的解决 理论 去随机 Dual Certificates(对偶保证?) Golfing Scheme 数值实验 代码 Candes E J, Li X, Ma Y, e ... 
- webmagic保存数据
			使用多线程: 
- List、Map、Set之间的联系与区别:
			一.数组和集合的区别: 1.数组的大小是固定的,并且同一个数组只能是相同的数据类型 2.集合的大小是不固定的,在不知道会有多少数据的情况下可使用集合. 二.集合的三种类型:list(列表).set(集 ... 
- 结构体中.和->两种访问区别
			定义结构体指针,访问成员时就用->定义结构体变量,访问成员时就用. 例如:struct A { int a; char b;}; struct A q; 访问成员就用:q.a;struct A ... 
- 使用FastJson进行对象和JSON转换属性命名规则为下划线和驼峰的问题
			public class AliPayParam { @JSONField(name="out_trade_no") private String outTradeNo; @JSO ... 
- let 和  const 在for 循环中的使用
			在ES6 的规范中,多了两个声明变量的关键字: let 和const.初次学习的时候,只记住了 let 声明的变量只在for 的循环体中有效,循环结束后 变量就消失了, 同时const 也可以在for ... 
- vue router 修改title(IOS  下动态改变title失效)
			在ios下app 设置document.title = "titleName" 失效,原因是在IOS webview中网页标题只加载一次,动态改变是无效的. 在路由配置中添加 ... 
