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. ...
随机推荐
- k8s 环境搭建(2)
安装docker组件 配置本地源或者自带的网络源2选1 1.切换镜像源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce ...
- Bulk RNA-seq 基本分析流程
目的: 对illumina数据进行处理,利用 RNA-Seq 发现新的 RNA 变体和剪接位点,或量化 mRNA 以进行基因表达分析等.对两组或多组样本的转录组数据,通过差异表达分析和对所发现的差异表 ...
- 14、Spring之基于注解的声明式事务
14.1.概述 14.1.1.编程式事务 事务功能的相关操作全部通过自己编写代码来实现: Connection conn = ...; try { // 开启事务:关闭事务的自动提交 conn.set ...
- 【Excel】VBA编程 01 入门
视频地址: https://www.bilibili.com/video/BV1Q5411p71p 在Excel种需要打开[开发工具]和[启用所有宏]两点 打开开发工具选项 宏启用 菜单栏才会有开发工 ...
- 【Redis】06 事务
Redis事务 可以一次执行多个命令,本质是一组命令的集合. 一个事务中的 所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞 官方说明: https://redis.io/topi ...
- 使用 abortNavigation 阻止导航
title: 使用 abortNavigation 阻止导航 date: 2024/8/3 updated: 2024/8/3 author: cmdragon excerpt: 摘要:在Nuxt3中 ...
- 顶级围棋AI被发现漏洞:“超人类人工智能”还有很长的路?
原文地址: https://www.bjnews.com.cn/detail/1720537986168936.html 参考资料: (1)Can AI be superhuman? Flaws in ...
- 一个疑问:foundation models , 现在已经有了视觉的大模型也有了语言大模型,那么什么时候会有强化学习大模型,更准确的说什么时候会有强化学习的基础模型(foundation models)
一个疑问:foundation models , 现在已经有了视觉的大模型也有了语言大模型,那么什么时候会有强化学习大模型,更准确的说什么时候会有强化学习的基础模型(foundation models ...
- 动手煮面的一次经历,加餐DIY
去年和今年一直是有疫情的,也是如此像我这种在学校呆着的不是在家窝着就是在学校窝着,尤其是到了假期的时候,如果晚回家几天那食堂的伙食就会变得十分的恐怖. 面对这样的伙食也是十分的无奈,虽然也是十分理解当 ...
- 【转载】 SUN RPC的传输层实现机制 —— rpcbind(nfs文件系统中的rpc)
原文地址: https://blog.csdn.net/dingguo815/article/details/5421675 ===================================== ...