GLSL利用SDF进行矩形绘制公式推导
简单记录一下关于SDF绘制矩形的公式推导,因为我们在iq的SDF代码中,给的直接是最后的推导结果,对它是怎么得来的,还是有点困惑。
//这是利用sdf绘制矩形
float sdBox( in vec2 p, in vec2 b )
{
vec2 d = abs(p)-b;
return length(max(d,0.0)) + min(max(d.x,d.y),0.0); // 突然看到这个代码,还是挺疑惑的,为什么就可以得到矩形的区域呢?
}
推导一下
1)常规计算(这种会导致GPU运行效率下降)
\begin{array}{*{20}{l}}
{{ \left( 1 \left) \text{ }d=\mathop{{P}}\nolimits_{{y}}-R\mathop{{}}\nolimits_{{y}}\right. \right. }}\
{ \left( 2 \left) d=\mathop{{P}}\nolimits_{{x}}-R\mathop{{}}\nolimits_{{x}}\right. \right. }\
{ \left( 3 \left) d\text{ }=\text{ }\sqrt{{ \left( \mathop{{P}}\nolimits_{{x}}-R\mathop{{}}\nolimits_{{x}} \left) \mathop{{}}\nolimits^{{2}}+ \left( \mathop{{P}}\nolimits_{{y}}-R\mathop{{}}\nolimits_{{y}} \left) \mathop{{}}\nolimits^{{2}}\right. \right. \right. \right. }}\right. \right. }
\end{array}
2)机智的办法,就是说用一个公式同时满足上述三个条件。
from numpy import *
d = sqrt(pow(max(Px-Rx,0), 2) + pow(max(Py-Ry, 0), 2))
当然用向量表示出来就是:
d = length(max(abs(P) - R), 0);
其中abs(P)表示将平面上的点转换到其第一象限所对应的点。
存在的问题
上述公式虽然可以在一定程度上绘制出矩形,但是对于矩形里面的点,我们其实是没有照顾到的,如果我们要对矩形里面进行一些操作,那就是一件非常糟糕的事情。所以我们还需要获取到矩形里面的距离值。我们知道,上述公式得到的 d>=0,也就是说,上述公式考虑的都是矩形之外的点。如果要考虑矩形内部的点,那势必d<0。所以我们需要对公式进行一点改进。
q = abs(P) - R;
d = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0);
我们可以看到,上述公式我们添加了 min(max(q.x, q.y), 0.0) 这个公式,直白来说,就是我们需要找到q.x(<0)和q.y(<0)的最大值,那么久越靠近矩形边缘,越靠近矩形中心,那么p.x和p.y的值就越小。
应用
所以我们需要对矩形内部边缘添加一些模糊的话,会很有效果。
GLSL利用SDF进行矩形绘制公式推导的更多相关文章
- 利用javascript和WebGL绘制地球 【翻译】
利用javascript和WebGL绘制地球 [翻译] 原翻译:利用javascript和WebGL绘制地球 [翻译] 在我们所有已知的HTML5API中,WebGL可能是最有意思的一个,利用这个AP ...
- 利用Flex组件birdeye绘制拓扑关系图
birdeye绘制拓扑关系图 1.flex简单介绍 Flex 是一个高效.免费的开源框架,可用于构建具有表现力的 Web应用程序,这些应用程序利用Adobe Flash Player和Adobe AI ...
- Android 利用SurfaceView进行图形绘制
SurfaceView使用介绍 SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作. 要使用SurfaceView进行绘制,步骤如下: 1.用SurfaceView ...
- canvas详解---矩形绘制
首先,就上述绘制弧线的章节进行一个小小的补充: 如果我们使用了context.beginPath();紧接着后面的context.moveTo(x,y),可以改为context.lineTo(x,y) ...
- 利用MsChart控件绘制多曲线图表 z
在.Net4.0框架中,微软已经将Mschart控件集成了进来,以前一直在web下面用过,原来winform下的Mschart控件更加简单更加方便,今天我们用mschart绘制一个多曲线图,话不多说, ...
- 利用GDI+在Winfrom绘制验证码
string yzm: private void yangzhengma() { Bitmap bt = new Bitmap(70,22);//创建位图对象 Graphics gs = Graphi ...
- 利用MsChart控件绘制多曲线图表(转载)
在.Net4.0框架中,微软已经将Mschart控件集成了进来,以前一直在web下面用过,原来winform下的Mschart控件更加简单更加方便,今天我们用mschart绘制一个多曲线图,话不多说, ...
- 利用对象思想来绘制canvas帧动画
绘制思路: 1.封装一个对象出来: 2.属性: width . height imgSr speed dir3.行为: render changeDir html文件: <script> ...
- 利用MsChart控件绘制多曲线图表
在.Net4.0框架中,微软已经将Mschart控件集成了进来,以前一直在web下面用过,原来winform下的Mschart控件更加简单更加方便,今天我们用mschart绘制一个多曲线图,发现MsC ...
- 利用OpenGL固定流水线绘制球体
在OS X上的一个OpenGL简单demo.所附赠的代码是绘制半个球体.开启了深度缓存和多重采样,采样数是4. 详细下载地址请见:http://www.cocoachina.com/bbs/read. ...
随机推荐
- 对比python学julia(第一章)--(第一节)万事开头也不难
自1989年被创立以后,历经30多年的发展,Python已经如日中天,在运维.大数据.云计算.web.科学计算上混的风生水起,并且于2020.2021年蝉联TIOBE年度编程语言首座.以至于,如今不会 ...
- 【Vue】el-select 数据过多替代方案
一.需求问题: 一开始就考虑使用简单el-select选取数据,但是后面数据量增多, 超过一千条开始,组件会很卡不好用,第二个是接口也慢了 数据量多的话是有一个filterable做支持了,可以输入关 ...
- 【RabbitMQ】11 深入部分P4 延迟队列
一.延迟队列: 消息经过交换机分配到队列上之后,在到达指定的时间,才会被消费? 需求: 1.下单之后的30分钟,用户未支付,订单取消,回滚库存 2.新用户注册7天后,发送短信慰问,或者是用户生日发送短 ...
- 【转载】 你真的理解Python中MRO算法吗?
来自:www.xymlife.com 作者: XYM 链接:http://www.xymlife.com/2016/05/22/python_mro/ (点击阅读原文前往) ------------- ...
- MindSpore 框架的官方预训练模型的加载 —— MindSpore / hub 的安装
MindSpore计算框架提供了一个官方版本的预训练模型存储库,或者叫做官方版本的预训练模型中心库,那就是 MindSpore / hub . 首先我们需要明确概念: 第一个就是 mindspore_ ...
- 在使用pytorch官方给出的torchvision中的预训练模型参数时为保证收敛性要求使用原始的数据预处理方式
本文主要内容如题: 在使用pytorch官方给出的torchvision中的预训练模型参数时为保证收敛性要求使用原始的数据预处理方式 具体的pytorch官方讨论: https://github.co ...
- java多线程之ReentrantLock详解
1.背景 2.基本语法 public class Test01 { // 定义锁 static ReentrantLock reentrantLock = new ReentrantLock(); p ...
- 利用sql查出的结果集重新生成一张虚拟表
"select * from ( SELECT mc.id,mc.sn,mc.updated,mc.client_name,mc.brand,mc.mileage,mc.displace,m ...
- RabbitMq高级特性之消费端限流 通俗易懂 超详细 【内含案例】
RabbitMq高级特性之消费端限流 介绍 消息队列中囤积了大量的消息, 或者某些时刻生产的消息远远大于消费者处理能力的时候, 这个时候如果消费者一次取出大量的消息, 但是客户端又无法处理, 就会出现 ...
- 远程采集服务器指标信息(一) 远程通过SSH执行命令
远程采集服务器信息,比如说磁盘信息.内存信息. 现介绍java通过SSH执行命令采集服务器信息,比如说执行df.ls.top. /** * * SSH远程执行shell类 */ public clas ...