返回顶部
首页 > 资讯 > 移动开发 >详解OpenGLShader抗锯齿的实现
  • 813
分享到

详解OpenGLShader抗锯齿的实现

2024-04-02 19:04:59 813人浏览 泡泡鱼
摘要

目录绘制圆形锯齿问题smoothstep函数介绍抗锯齿实现扩展自制smoothstep函数抗锯齿自制linearstep函数抗锯齿绘制圆形锯齿问题 普通绘制圆形形状时可以看到图形边缘

绘制圆形锯齿问题

普通绘制圆形形状时可以看到图形边缘会有明显锯齿现象并不像真实圆形形状一样圆润边缘平滑。在glsl中这种情况是常见情况,这里是可以借助glsl内置函数来消除锯齿现象。

vec3 sdfCircle(vec2 uv,float r,vec3 value){
    float d = length(uv) - r;
    return d > 0. ? vec3(0.3294, 0.3294, 0.9333) : value; // 大于0超出画圆范围,小于0在画圆范围内
}
void main() {
    vec2 uv = gl_FraGCoord.xy / iResolution.xy;
    uv -= 0.5; // x: <-0.5, 0.5>, y: <-0.5, 0.5>
    uv.x *= iResolution.x/iResolution.y; // x: <-0.5, 0.5> * aspect ratio, y: <-0.5, 0.5>
    vec3 circle = sdfCircle(uv,0.4,vec3(1.));
    circle = mix(circle,sdfCircle(uv,0.3,vec3(1.)),0.5);
    circle = mix(circle,sdfCircle(uv,0.2,vec3(1.)),0.7);
    gl_FragColor = vec4(circle,.9);
}

smoothstep函数介绍

smoothstep(a, b, x)函数结果范围:

返回值条件
0x<a<b 或 x>a>b
1x<b<a 或 x>b>a
某个值根据x在[a,b]或[b,a]区间范围内,返回一个在[0,1]之间的值

内置函数smoothstep就能实现绘制圆形图形的抗锯齿效果。可能之前有使用过内置函数step同样都是步进式功能函数,不同于step函数可以理解为if-elsesmoothstep函数是平滑过渡的。

抗锯齿实现

使用smoothstep实现抗锯齿功能需要修改一下原先的画圆公式。原来只需要使用到length(uv) - r来判断是否选择绘制圆的颜色,而现在需要修改成通过smoothstep(m-0.002,m+0.002,length(uv) - 0.2)计算值作为mix函数混合系数值来实现平滑过渡到画圆色值,这样就能实现抗锯齿了。

    vec2 uv = gl_FragCoord.xy / iResolution.xy;
    uv -= 0.5; // x: <-0.5, 0.5>, y: <-0.5, 0.5>
    uv.x *= iResolution.x/iResolution.y; // x: <-0.5, 0.5> * aspect ratio, y: <-0.5, 0.5>
    float m = 0.2;
    m = smoothstep(m-0.002,m+0.002,length(uv) - 0.2);
    vec3 pixel = mix(vec3(1.),vec3(0.3294, 0.3294, 0.9333),m);
    gl_FragColor = vec4(pixel,1.0);

如果把脚本其中m-0.002,m+0.0020.002范围进行修改。例如修改成0.02,运行结果可以发现圆形变模糊了。这就是区间过大导致平滑区间渐变范围在肉眼可见范围了,因此设置一个适当过渡区间才能实现较好的抗锯齿效果。

扩展

清楚实现抗锯齿原理之后,可以根据需要自行实现一个平滑过渡函数来实现抗锯齿功能。类似像以下两个自制平滑过渡函数最终实现效果几乎看不出太大区别。

自制smoothstep函数抗锯齿

float smootherstep(float edge0, float edge1, float x) {
    float t = (x - edge0)/(edge1 - edge0);
    float t1 = t*t*t*(t*(t*6. - 15.) + 10.);
    return clamp(t1, 0.0, 1.0);
}
void main() {
    vec2 uv = gl_FragCoord.xy / iResolution.xy;
    uv -= 0.5; // x: <-0.5, 0.5>, y: <-0.5, 0.5>
    uv.x *= iResolution.x/iResolution.y; // x: <-0.5, 0.5> * aspect ratio, y: <-0.5, 0.5>
    float m = 0.2;
    m = smootherstep(m-0.002,m+0.002,length(uv) - 0.2);
    vec3 pixel = mix(vec3(1.),vec3(0.3294, 0.3294, 0.9333),m);
    gl_FragColor = vec4(pixel,1.0);
}

自制linearstep函数抗锯齿

float linearstep(float edge0, float edge1, float x) {
    float t = (x - edge0)/(edge1 - edge0);
    return clamp(t, 0.0, 1.0);
}
void main(){
   vec2 uv = gl_FragCoord.xy / iResolution.xy;
    uv -= 0.5; // x: <-0.5, 0.5>, y: <-0.5, 0.5>
    uv.x *= iResolution.x/iResolution.y; // x: <-0.5, 0.5> * aspect ratio, y: <-0.5, 0.5>
    float m = 0.2;
    m = linearstep(m-0.002,m+0.002,length(uv) - 0.2);
    vec3 pixel = mix(vec3(1.),vec3(0.3294, 0.3294, 0.9333),m);
    gl_FragColor = vec4(pixel,1.0);
}

smoothstep

linearstep

以上就是详解OpenGL Shader抗锯齿的实现的详细内容,更多关于OpenGL Shader抗锯齿的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解OpenGLShader抗锯齿的实现

本文链接: https://lsjlt.com/news/138923.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解OpenGLShader抗锯齿的实现
    目录绘制圆形锯齿问题smoothstep函数介绍抗锯齿实现扩展自制smoothstep函数抗锯齿自制linearstep函数抗锯齿绘制圆形锯齿问题 普通绘制圆形形状时可以看到图形边缘...
    99+
    2024-04-02
  • OpenGL Shader抗锯齿如何实现
    这篇文章主要为大家展示了“OpenGL Shader抗锯齿如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“OpenGL Shader抗锯齿如何实现”这篇文章吧。绘制圆形...
    99+
    2023-06-29
  • ​CSS3怎么实现字体抗锯齿渲染效果
    这篇文章给大家分享的是有关CSS3怎么实现字体抗锯齿渲染效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。     对字体进行抗锯齿渲染可以使字体看起来会更...
    99+
    2024-04-02
  • Android编程画图之抗锯齿解决方法
    本文实例分析了Android编程画图之抗锯齿解决方法。分享给大家供大家参考,具体如下: 在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。其实Android自带了...
    99+
    2022-06-06
    方法 抗锯齿 Android
  • Android画图之抗锯齿paint和Canvas两种方式实例
    在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。其实Android自带了解决方式。 方法一:给Paint加上抗锯齿标志。然后将Paint对象作为参数传给can...
    99+
    2022-06-06
    canvas Android
  • 怎么在Android应用中利用paint与Canvas实现抗锯齿效果
    怎么在Android应用中利用paint与Canvas实现抗锯齿效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。方法一:给Paint加上抗锯齿标志。然后将Paint对象作...
    99+
    2023-05-31
    android paint canvas
  • php如何实现消除锯齿
    这篇文章主要介绍php如何实现消除锯齿,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php实现消除锯齿的方法:首先创建一个PHP示例文件;然后通过“imageantialias($aa, true);”方法实现抗锯齿...
    99+
    2023-06-08
  • 实例详解CSS渐变锯齿问题如何解决!
    那么为啥会产生锯齿感呢?传统网页的呈现是基于像素单位的,对于这种一种颜色直接过渡另外一种颜色状态的图片,容易导致可视质量下降(信息失真)。因而对于普通的渐变元素,像是上述写法,产生了锯齿,这是非常常见的在使用渐变过程中的一个棘手问题。简单的...
    99+
    2022-11-25
    锯齿 渐变 css
  • C#Winform实现圆角无锯齿按钮
    本文实例为大家分享了C# Winform实现圆角无锯齿按钮的具体代码,供大家参考,具体内容如下 发现用Winform做一个圆角按钮遇到麻烦,主要是锯齿问题,后面想了想办法解决问题了。...
    99+
    2024-04-02
  • C# Winform实现圆角无锯齿按钮
    前言: 发现用Winform做一个圆角按钮遇到麻烦,主要是锯齿问题,后面想了想办法解决问题了。 主要方法是按钮的区域通过Region指定,但按钮需要自己画,否则怎么搞都出现锯齿,网上...
    99+
    2024-04-02
  • css3旋转出现锯齿如何解决
    这篇文章主要讲解了“css3旋转出现锯齿如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css3旋转出现锯齿如何解决”吧!css3旋转出现锯齿的解决办法:1、在CSS3 transfo...
    99+
    2023-07-05
  • CSS3中字体平滑处理和抗锯齿渲染的示例分析
    这篇文章主要介绍了CSS3中字体平滑处理和抗锯齿渲染的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在围观Drupal官方主题的时候...
    99+
    2024-04-02
  • C#中的矩形数组和锯齿数组怎么实现
    本篇内容主要讲解“C#中的矩形数组和锯齿数组怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中的矩形数组和锯齿数组怎么实现”吧!(一)矩形数组在C#中,矩形数组(rectangular...
    99+
    2023-07-06
  • 详解OpenGLShader彩虹条纹效果的实现
    目录前言回顾效果实现增加条纹角度变化拓展前言 在一款图片处理软件colorow中发现彩虹效果滤镜感觉蛮有意思。 在OpenGL Shader系列更新到现在尝试通过之前积累的知识点来...
    99+
    2024-04-02
  • OpenGLShader实现物件材料效果详解
    目录需求背景需求实现功能拓展高级实现结果总结需求背景 在一些主流app上有一些比较特殊的滤镜效果,例如灰尘、塑料封面、光影效果等。在此之前一直困惑这类滤镜效果是如何实现的,单纯gls...
    99+
    2024-04-02
  • OpenGLShader实现简单转场效果详解
    目录转场介绍渐变转场切换转场x轴切换y轴切换对角线切换位移转场x轴位移y轴位移转场介绍 转场效果常出现再视频剪辑当中,用于衔接两段视频片段切换的过渡效果。转场常常在两个场景切换中去使...
    99+
    2024-04-02
  • C#中的矩形数组(多维数组)和锯齿数组的实现
    目录(一)矩形数组(二)锯齿数组总结(一)矩形数组 在C#中,矩形数组(rectangular array),又称多维数组,是使用多个索引访问其元素的数组。 1. 二维数组的声明: ...
    99+
    2023-05-15
    C# 矩形数组 C# 锯齿数组 C# 多维数组
  • 如何解决纯css写三角形在firefox下的锯齿问题
    这篇文章主要介绍“如何解决纯css写三角形在firefox下的锯齿问题”,在日常操作中,相信很多人在如何解决纯css写三角形在firefox下的锯齿问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操...
    99+
    2024-04-02
  • 生成对抗网络(GAN)详解与实例
    GAN介绍 理解GAN的直观方法是从博弈论的角度来理解它。GAN由两个参与者组成,即一个生成器和一个判别器,它们都试图击败对方。生成备从分巾中狄取一些随机噪声,并试图从中生成一些类似于输出的分布。生成...
    99+
    2023-09-25
    python 深度学习 pytorch GAN 生成对抗网络
  • HTML5实现的齿轮动画特效代码
    这篇文章主要介绍“HTML5实现的齿轮动画特效代码”,在日常操作中,相信很多人在HTML5实现的齿轮动画特效代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HTML5实现的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作