在片段着色器中绘制对象和平面之间的交集

时间:2017-02-08 15:37:24

标签: glsl webgl intersection fragment-shader plane

我想在片段着色器中绘制一个对象与平面相交的线。

我将平面方程传递给片段着色器(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

1 个答案:

答案 0 :(得分:1)

您必须考虑&#34;缩放系数&#34; /缩放您的视图。对于2D情况(您的图片看起来非常2D),均匀缩放和无旋转这很容易。传递模型视图矩阵并提取[0] [0]个元素(或将该值传递给着色器)。用它除去你的距离值。 要从具有旋转和平移的模型视图矩阵中提取适当的缩放值,请参阅this