Я хочу использовать шейдеры, чтобы не только отбрасывать фрагменты, если они находятся на одной стороне предопределенной плоскости, но и отображать контур вдоль пересечения.
Мой фрагментный шейдер в настоящее время делает что-то вроде:
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);
}