在片段着色器中绘制物体和平面之间的交点

问题描述:

我想绘制一条线,其中物体与片段着色器中的平面相交。在片段着色器中绘制物体和平面之间的交点

我将平面方程传递给片段着色器(a,b,c,d),并且希望以红色绘制我的对象和此均匀平面之间的交点。

我想路口的宽度是始终不变的,无论我们多么放大

现在,我从我的对象的距离,飞机在片段着色器为:

// uPlane: vec4 where values are a.b.c.d (plane equation) 
    // vPos: wodlPosition of the fragment 
    vec4 prod = uPlane*vPos; 
    float distance = (prod.r + prod.g + prod.g + prod.a)/length(uPlane.xyz); 

    if(abs(distance) < 1.) { 
    gl_FragColor = vec4(1., 0., 0., .5); 
    } else { 
    gl_FragColor = vec4(0., 1., 0., .5); 
    } 

这种方法的问题是,当我放大/缩小时,交叉点的“宽度”会发生变化(请参见下面的截图)。

这将是在我的对象和飞机制服之间的交点处绘制“2px宽度”线的最佳方法吗?

enter image description here enter image description here

+0

一个解决方案可能是将片段位置投影到平面上,然后以某种方式计算投影屏幕坐标,然后将投影的屏幕坐标与片段屏幕坐标进行比较,并使用该信息绘制线条 – Nicolas

你必须考虑的 “放大倍数” 您的视图/缩放。对于2D情况(你的图片看起来非常2D),统一缩放和不旋转,这很容易。传递模型视图矩阵并提取[0] [0]个元素(或将该值传递给着色器)。用你的距离值除以它。 用于从旋转和平移的模型视图矩阵中提取适当的缩放值,请参阅this