Показывает ребра между плоскостью отсечения и отсеченными объектами

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

Мой фрагментный шейдер в настоящее время делает что-то вроде:

float dot = dot(world_coordinate, normalize(clipping_normal.xyz)) - clipping_normal.w;
if (dot > 0.0f) 
    discard;

это работает, но без желаемого контура. Я попытался сравнить точечный продукт со значениями, близкими к 0,0, но это приводит к контуру с различной шириной в зависимости от вида и т. Д.

Это то, чего я пытаюсь достичь. Обратите внимание, что белый контур/край пересечения плоскости со сферой имеет постоянную ширину:

поперечное сечение

Ниже приведен результат, который я сейчас вижу:

мой результат

С фрагментным шейдером:

in vec4 color;
in vec3 world_position; 

out vec4 frag_color;

void main()
{    
    float dist = (dot(clipping_plane.xyz, world_position) - clipping_plane.w) / 
              dot(clipping_plane.xyz, clipping_plane.xyz);

    if(dist >= 0.0f && dist < 0.05f)
        frag_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
    else if(dist < 0.0f) 
        discard;
    else
        frag_color = ComputePhong(color);
}

person zman    schedule 26.02.2019    source источник
comment
Не могли бы вы добавить пример того, что вы ищете? Кроме того: должно ли это быть точным или достаточно алгоритма обнаружения края?   -  person Emond Erno    schedule 26.02.2019
comment
Я добавил изображение, этого должно быть достаточно или нет?   -  person zman    schedule 26.02.2019
comment
Нет, что вы считаете контуром? Разве белый край не контур?   -  person Emond Erno    schedule 26.02.2019
comment
Обновил вопрос более подробно   -  person zman    schedule 28.02.2019


Ответы (1)


Контур пересечения также принадлежит плоскости отсечения, поэтому расстояние до этой плоскости равно нулю.

Использование dot(point, normal) недостаточно. Вам нужно d= A·x + B·y + C·z + D, которое является числителем (без «модуля») формулы полного расстояния от точки до плоскости. См. раздел геометрия плоскости.

Это вычисленное d дает вам не только расстояние (добавьте квадрат в знаменателе, если нормальные A, B, C не являются унитарными), но также его знак говорит вам, с какой стороны плоскости находится точка.

Работая внутри фрагментного шейдера, скорее всего, вы работаете с координатами NDC. Так что тоже преобразуйте A,B,C,D в NDC.

person Ripi2    schedule 26.02.2019
comment
В настоящее время я работаю с мировыми координатами во фрагментном шейдере. Ваш подход дает немного лучший результат, но, к сожалению, не решает проблему полностью. Контур не имеет постоянной ширины и меняется в зависимости от поворота камеры. При необходимости могу прикрепить ссылку с изображением проблемы. - person zman; 28.02.2019
comment
@zman Изображение хорошо, а с кодом еще лучше. Вы можете отредактировать свой вопрос и добавить оба. - person Ripi2; 28.02.2019
comment
Обновлен мой вопрос с дополнительной информацией. - person zman; 28.02.2019