1.UGUI源码阅读之Mask
2.VB 如何判断两条线段是相交相交否相交?
3.用java求两个圆关系的代码,,分析分析求完整的源码源码,正确的相交相交源代码,谢谢!分析分析!源码源码源码播放软件
4.平面与包围盒的相交相交相交测试
UGUI源码阅读之Mask
Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的分析分析模版测试。
Unity Shader中的源码源码模版测试配置代码大致如上
模版测试的伪代码大概如上
传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,相交相交但是分析分析现在又出现了Early Fragment Test,可以在片元着色器之前进行。源码源码
Mask直接继承了UIBehaviour类,相交相交同时继承了ICanvasRaycastFilter和IMaterialModifier接口。分析分析
Mask主要通过GetModifiedMaterial修改graphic的源码源码Material。大致流程:
1.获取当前Mask的层stencilDepth
2.StencilMaterial.Add修改baseMaterial的模板测试相关配置,并将其缓存
3.StencilMaterial.Add设置一个unmaskMaterial,用于最后将模板值还原
MaskableGraphic通过MaskUtilities.GetStencilDepth计算父节点的Mask层数,然后StencilMaterial.Add修改模板测试的配置。
通过Frame Debugger看看具体每个batch都做了什么。先看第一个,爱心公益小程序源码是Mask1的m_MaskMaterial,关注Stencil相关的数值,白色圆内的stencil buffer的值设置为1
这个是Mask2的m_MaskMaterial,根据stencil的计算公式,Ref & ReadMask=1,Comp=Equal,只有stencil buffer & ReadMask=1的像素可以通过模板测试,即第一个白色圆内的像素,然后Pass=Replace,会将通过的fabric共识算法源码在哪像素写入模板值(Ref & WriteMask=3),即两圆相交部分模板值为3
这个是RawImage的Material,只有模板值等于3的像素可以通过模板测试,所以只有两个圆相交的部分可以写入buffer,其他部分舍弃,通过或者失败都不改变模板值
这是Mask2的unmaskMaterial,将两个圆相交部分的模板值设置为1,也就是还原Mask2之前的stencil buffer
这是Mask1的unmaskMaterial,将第一个圆内的模板值设置为0,还有成最初的stencil buffer
可以看到Mask会产生比较严重的overdraw。
2.drawcall和合批
每添加一个mask,百倍支付源码一般会增加2个drawcall(加上mask会阻断mask外和mask内的合批造成的额外drawcall),一个用于设置遮罩用的stencil buffer,一个用于还原stencil buffer。
如图,同一个Mask下放置两个使用相同的RawImage,通过Profiler可以看到两个RawImage可以进行合批
如图,两个RawImage使用相同的,它们处于不同的Mask之下,但是只要m_StencilValue相等,两个RawImage还是手机在线客服网页源码可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。
StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。
VB 如何判断两条线段是否相交?
添加2个line控件~一个按钮
Private Sub Command1_Click()
Dim X1 As Long, Y1 As Long, X2 As Long, Y2 As Long
Dim A1 As Long, B1 As Long, A2 As Long, B2 As Long
Dim a As Long, b As Long
X1 = Line1.X1: X2 = Line1.X2: Y1 = Line1.Y1: Y2 = Line1.Y2
A1 = Line2.X1: A2 = Line2.X2: B1 = Line2.Y1: B2 = Line2.Y2
a = F(X1, Y1, X2, Y2, A1, B1)
b = F(X1, Y1, X2, Y2, A2, B2)
If a * b = 0 Then
Print "两直线有交叉。"
ElseIf a * b > 0 Then
Print "两直线没有交叉。"
Else
a = F(A1, B1, A2, B2, X1, Y1)
b = F(A1, B1, A2, B2, X2, Y2)
If a * b <= 0 Then
Print "两直线有交叉。"
Else
Print "两直线没有交叉。"
End If
End If
End Sub
Private Function F(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X As Long, ByVal Y As Long) As Long
Dim K As Long
K = (Y2 - Y1) * X - (X2 - X1) * Y + X2 * Y1 - X1 * Y2
F = Sgn(K)
End Function
用java求两个圆关系的代码,,求完整的,正确的源代码,谢谢!!
public class Cycle {
private double x = 0;//圆心横坐标
private double y = 0;//圆心纵坐标
private double r = 0;//圆心半径
public static void main(String[] args) {
String relation = "";
Cycle c = new Cycle(0,0,1);
//相交 外切 内切 相离
Cycle c_xiangJiao = new Cycle(3,4,5);
Cycle c_waiQie = new Cycle(3,4,4);
Cycle c_neiQie = new Cycle(3,4,6);
Cycle c_xiangLi = new Cycle(3,4,2);
relation = c.relationWithOtherCycle(c_xiangJiao);
System.out.println("c && c_xiangJiao relationShip :"+relation);
relation = c.relationWithOtherCycle(c_xiangLi);
System.out.println("c && c_xiangLi relationShip :"+relation);
relation = c.relationWithOtherCycle(c_neiQie);
System.out.println("c && c_neiQie relationShip :"+relation);
relation = c.relationWithOtherCycle(c_waiQie);
System.out.println("c && c_waiQie relationShip :"+relation);
}
public Cycle(double x, double y, double r) {
this.r = r;
this.x = x;
this.y = y;
}
public Cycle() {
}
public String relationWithOtherCycle(Cycle c){
String relation = ""; //相交 外切 内切 相离
double length = 0;// (x-x1)*(x-x1)+(y-y1)*(y-y1) 开平方
length = Math.sqrt((this.x-c.getX())*(this.x-c.getX())+(this.y-c.getY())*(this.y-c.getY()));
//System.out.println("length : "+length);
if(length>(this.r+c.getR())){
relation = "相离";
}else if (length==(this.r+c.getR())){
relation = "外切";
}else if (length==Math.abs(this.r-c.getR())){
relation = "内切";
}else if (length<Math.abs(this.r+c.getR())&&length>Math.abs(this.r-c.getR())){
relation = "相交";
}
return relation;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public double getR() {
return r;
}
public void setR(double r) {
this.r = r;
}
}
//把测试程序写在Cycle的main方法里了
平面与包围盒的相交测试
平面与包围盒的相交测试是一种关键的几何计算,用于判断两者是否相交、相切或位于同一侧。Akenine-Möller算法提供了两种有效的测试方法:轴对齐包围盒和有向包围盒的判定。
轴对齐包围盒的测试通过找到与平面法向量最接近的对角线来判断。首先,确定对角线端点[公式]和[公式],满足[公式]的条件。通过对[公式]取最大值和最小值,确定包围盒与平面的关系:若[公式]或[公式],则相切;否则,相交。有向包围盒则需对轴线进行平面法向量方向的投影,然后根据中心点到平面的距离判断相交情况。
距离判定法更为直观,通过将包围盒中心投影到平面法线上,根据距离与平面的距离关系,判断相交、相切或在平面两侧。这种方法更便于实现,直接计算中心点的有符号距离即可做出判断。
代码实现可以在相关基础库中找到,如链接[这里]提供的源码。总的来说,平面与包围盒的相交测试算法提供了实用且高效的方法,对于3D图形处理和碰撞检测等领域至关重要。