2017-02-08 19 views
0

Я хочу нарисовать линию, где объект пересекает плоскость, в шейдере фрагмента.провести пересечение между объектом и плоскостью в фрагменте шейдера

Я передаю уравнение плоскости в шейдер фрагмента (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 width» на пересечении между моим объектом и плоскостью?

enter image description here enter image description here

+0

Одним из решений может быть каким-то образом проецировать положение фрагмента на плоскость, затем как-то вычислить координаты экрана проекции, затем сравнить координату экрана проекции с координатой экрана фрагмента и использовать эту информацию для рисования линии – Nicolas

ответ

1

Вы должны учитывать "фактор масштабирования"/масштабирования вашего зрения. Для 2D-футляра (ваши изображения выглядят в значительной степени 2D), равномерное масштабирование и без вращения это довольно просто. Передайте матрицу модели и извлеките [0] [0] -й элемент (или передайте это значение шейдеру). Разделите его значение расстояния. Для извлечения правильного значения масштабирования из матрицы модели с поворотами и переводами см. this.