knightforyou / testcyber

0 stars 0 forks source link

光标触控板等 #12

Open knightforyou opened 8 months ago

knightforyou commented 8 months ago

SDF学习

Signed Distance Fields(有符号的距离场):符号距离域是一种不同的存储(通常是单色)位图数据的方式。 位图中的每个像素并不代表该点的强度,而是代表与源图像中最近的非黑色像素的距离。形状外的像素有正的距离值,而形状内的像素有负的距离值,因此名字中的 "符号 "部分。

距离场的应用

由于距离场的源数据一般都是单色的,所以其作用有限,然而有一种应用特别适合距离场,那就是绘制文字及颜色缺少变化的场景。《黑神话·悟空》里使用了SDF来实现了诸多效果。

SDF生成算法 - 8ssedt

now.sdf = 999999;
if(now in object){
    now.sdf = 0;
}else{
    foreach(near in nearPixel(now)){
        now.sdf = min(now.sdf,near.sdf + distance(now,near));
    }
}
//near表示附近像素点,now表示当前像素,near.sdf表示near的SDF值,distance表示两点之间距离。https://zhuanlan.zhihu.com/p/337944099

bitmap与SDF:光滑放大

Bitmap 存储各点的颜色
A B1 B2 B3 C
A = (0,0,0),C = (1,1,1)
B1 = A * 0.75 + C * 0.25 = (0.25,0.25,0.25)
B2 = A * 0.5 + C * 0.5 = (0.5,0.5,0.5)
B3 = A * 0.25 + C *0.75 = (0.75,0.75,0.75)  //无实际意义的颜色

SDF,存储距离原点的距离
A B1 B2 B3 C
A = (0,0),C = (4,0)
B1 = A * 0.75 + C * 0.25 = (1,0)
B2 = A * 0.5 + C * 0.5 = (2,0)
B3 = A * 0.25 + C *0.75 = (3,0)  //B1 B2 B3 "正确"的与原点之间的距离

位图颜色是标量,而SDF像素点存的是有方向的矢量,通过计算还原图片,但本质上是操作向量;所以放大的过程本质上是向量重建的过程,并不损失精度,从而可以实现光滑放大。

实现图像之间的平滑过渡

half4 col = half4(1,1,1,1);
half a1 = lerp(color1.r , color2.r, _SDFLerp);
col.a = smoothstep(0.5, 0.5 - _SmoothDelta , a1);
//在shader中简单的插值,得到比较理想的过渡效果
// Shader 是一种在图形渲染中用于计算光影效果的计算机程序。它是基于 OpenGL API 的一个重要组成部分,能够实现包括纹理、阴影、反射、透明度等在内的各种效果。

1、SDF方面的知识:SDF的圆角问题以及多通道SDF的参考资料:https://zhuanlan.zhihu.com/p/398656596 2、Signed Distance Fields(有符号的距离场):https://zhuanlan.zhihu.com/p/357606643 3、Signed Distance Field:https://zhuanlan.zhihu.com/p/337944099 4、GAMES101-现代计算机图形学入门-闫令琪:https://www.bilibili.com/video/BV1X7411F744/?p=6 5、SDF(signed distance field)基础理论和计算:https://zhuanlan.zhihu.com/p/536530019 6、SDF (Signed Distance Field) 相关内容:https://blog.csdn.net/Game_jqd/article/details/121708448