在片段着色器中绘制物体和平面之间的交点
问题描述:
我想绘制一条线,其中物体与片段着色器中的平面相交。在片段着色器中绘制物体和平面之间的交点
我将平面方程传递给片段着色器(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宽度”线的最佳方法吗?
答
你必须考虑的 “放大倍数” 您的视图/缩放。对于2D情况(你的图片看起来非常2D),统一缩放和不旋转,这很容易。传递模型视图矩阵并提取[0] [0]个元素(或将该值传递给着色器)。用你的距离值除以它。 用于从旋转和平移的模型视图矩阵中提取适当的缩放值,请参阅this。
一个解决方案可能是将片段位置投影到平面上,然后以某种方式计算投影屏幕坐标,然后将投影的屏幕坐标与片段屏幕坐标进行比较,并使用该信息绘制线条 – Nicolas