使用Shader画常见的数学函数

本篇博文的灵感来自于Shader Books这一小节:https://thebookofshaders.com/05/?lan=ch

代码运行网站:http://editor.thebookofshaders.com/

一次函数

\[y = x + 0.5
\]
#ifdef GL_ES
precision mediump float;
#endif uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time; // Plot a line on Y using a value between 0.0-1.0
float plot(vec2 st, float y) {
return smoothstep(y-0.01, y, st.y) - smoothstep(y, y+0.01, st.y);
} void main() {
vec2 st = gl_FragCoord.xy/u_resolution; float y = st.x + 0.5; // 这里对于每一个x,求出了其对应的y值;
// Plot a line
float pct = plot(st, y); //使用st
// color = vec3(pct);
vec3 color = pct*vec3(0.0,1.0,0.0); gl_FragColor = vec4(color,1.0);
}

代码整体比较抽象,但是仔细捋一下,也不算太复杂。

这个函数接收像素点对应的坐标,归一化之后的,以及其x对应的y值;由于这是一个shader,所以每个像素都会有一个对应的float返回值,我们尝试看一下每个像素对应的返回值的样子,并把它填充在网格里。

这样边根据y值得到了一条曲线。

二次函数

// Author: CuriosityWang
// Title: Expo #ifdef GL_ES
precision mediump float;
#endif #define PI 3.14159265359 uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time; float plot(vec2 st, float y){
return smoothstep( y-0.01, y, st.y) -
smoothstep( y, y+0.01, st.y);
} void main() {
vec2 st = gl_FragCoord.xy / u_resolution; float y = pow(st.x, 5.); float pct = plot(st, y);
vec3 color= pct*vec3(0.0,1.0,0.0); gl_FragColor = vec4(color,1.0);
}

二次函数的实现道理是一样的,比较重要的点就是plot函数,根据smoothstep上界和下界,通过减法得到曲线。

三角函数

// Author: CuriosityWang
// Title: Expo #ifdef GL_ES
precision mediump float;
#endif #define PI 3.14159265359 uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time; float plot(vec2 st, float y){
return smoothstep( y-0.01, y, st.y) -
smoothstep( y, y+0.01, st.y);
} void main() {
vec2 st = gl_FragCoord.xy / u_resolution; float y = 0.5* sin(st.x*2.*PI) + 0.5; float pct = plot(st, y);
vec3 color= pct*vec3(0.0,1.0,0.0); gl_FragColor = vec4(color,1.0);
}

// Author: CuriosityWang
// Title: Expo #ifdef GL_ES
precision mediump float;
#endif #define PI 3.14159265359 uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time; float plot(vec2 st, float y){
return smoothstep( y-0.01, y, st.y) -
smoothstep( y, y+0.01, st.y);
} void main() {
vec2 st = gl_FragCoord.xy / u_resolution; float y = 0.5*floor(sin(st.x*2.*PI + 3.*u_time)) + 0.5; float pct = plot(st, y);
vec3 color= pct*vec3(0.0,1.0,0.0); gl_FragColor = vec4(color,1.0);
}

使用Shader画常见的数学函数的更多相关文章

  1. Java开发笔记(十一)常见的数学函数

    前面介绍了Java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≍.求绝对值的“| |”.开平方的“√ ̄”,这些运算符形态各异,而且并非ASCII码 ...

  2. MySql常见命令、函数

    ⒈常见命令 命令 说明 show databases; 显示数据库列表 use DataBaseName; 打开指定的数据库 show tables; 显示当前打开数据库的表列表 show table ...

  3. js 绘制数学函数

    <!-- <!doctype html> --> <html lang="en"> <head> <meta charset= ...

  4. PHP 基础篇 - PHP 的 BC MATH 系列数学函数

    一.常见问题 用 PHP 做计算时经常会遇到精度带来的问题,下面来看两个常见的例子: 1. 运算比较 下面表达式输出的结果不是相等: <?php echo 2.01 - 0.01 == 2 ? ...

  5. 2018.8.17 关于JavaScript的几种常见的全局函数

    JavaScript常见的全局函数 <!doctype html> <html lang="en"> <head> <meta chars ...

  6. 【前端】 在前端利用数学函数知识+box-shadow解波浪图形

    序 今天正在刷数学函数相关题目,刷到了下面这篇文章,哇哦-有意思. 利用cos和sin实现复杂的曲线.传送门在下面. CSS 技巧一则 -- 在 CSS 中使用三角函数绘制曲线图形及展示动画 正巧在复 ...

  7. 现代 CSS 解决方案:CSS 数学函数

    在 CSS 中,其实存在各种各样的函数.具体分为: Transform functions Math functions Filter functions Color functions Image ...

  8. Sql Server函数全解<二>数学函数

    阅读目录 1.绝对值函数ABS(x)和返回圆周率的函数PI() 2.平方根函数SQRT(x) 3.获取随机函数的函数RAND()和RAND(x) 4.四舍五入函数ROUND(x,y) 5.符号函数SI ...

  9. Sql Server函数全解(二)数学函数

      数学函数主要用来处理数值数据,主要的数学函数有:绝对值函数,三角函数(包括正弦函数,余弦函数,正切函数,余切函数).对数函数,随机函数等.在错误产生时,数学函数将返回空值null.本次介绍各种数学 ...

  10. Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串

    第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service m ...

随机推荐

  1. 即时通讯安全篇(十一):IM聊天系统安全手段之传输内容端到端加密技术

    本文由融云技术团队分享,原题"互联网通信安全之端到端加密技术",内容有较多修订和改动. 1.引言 在上篇<IM聊天系统安全手段之通信连接层加密技术>中,分享了关于通信连 ...

  2. 解读ENS网络连接,面向多云多池网络的高效互联

    本文分享自华为云社区<ENS网络连接,面向多云多池网络的高效互联>,作者:华为云Stack ENS研发团队. 1.ENS网络连接服务场景详细介绍 ENS网络连接通过统一建模和全局管控实现跨 ...

  3. WPF 设置Button的content为多行模式

    查找button的子元素是个TextBlock,再设置它的TextWrappingProperty属性为 TextWrapping.Wrap. Button btn2 = new Button() { ...

  4. 面试题:区分List中remove(int index)和remove(Object obj)

    面试题:区分List中remove(int index)和remove(Object obj) package com.atguigu.exer;import org.junit.Test;impor ...

  5. 数组中的常见异常: 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion 2. 空指针异常:NullPointerException

    数组中的常见异常:  1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion   2. 空指针异常:NullPointerException package com.ch ...

  6. [BZOJ P2771] 天才ACM

    [BZOJ P2771] 天才ACM 传送门 朴素算法 枚举终点 \(r\),对区间 \([l, r]\) 排序求校验值 \(sum\),比较 \(sum\) 和 \(t\) $ sum \le t ...

  7. oracle goldengate for downstreams 配置--for 数据库参数配置和ogg进程参数配置

    1.整体数据库配置三个源端和一个downstream下游抽取数据库配置:alter system set enable_goldengate_replication=TRUE;Alter databa ...

  8. 一款由 .NET 官方团队开源的电子商务系统 - eShop

    项目介绍 eShop是一款由.NET官方开源的,基于.NET Aspire构建的用于参考学习的服务架构电子商务系统,旨在展示如何利用.NET框架及其相关技术栈构建一个现代化的电子商务网站.该项目采用服 ...

  9. Ceph PG状态介绍

    本文分享自天翼云开发者社区<Ceph PG状态介绍>,作者:wwwdl 一.基本概念 size:副本数(如三副本,size=3): min_size:支持可读写的最小副本数(如三副本,mi ...

  10. 接口性能测试---locust脚本编写(一)

    本文分享自天翼云开发者社区<接口性能测试---locust脚本编写(一)>,作者:丁****乐 一.安装 locust是用python编写的一款开源接口性能测试工具,以python3为例, ...