我想利用着色器不仅丢弃片段(如果它们位于预定义平面的一侧),还沿交点渲染轮廓。
我的片段着色器目前正在执行以下操作:
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);
}
答案 0 :(得分:1)
相交的轮廓也属于剪切平面,因此到该平面的距离为零。
仅使用dot(point, normal)
是不够的。您需要d= A·x + B·y + C·z + D
,它是全距离点对平面公式的分子(不带“模数”)。参见plane geometry。
计算得出的d
不仅为您提供距离(如果法线A,B,C不统一,则在分母中加上平方),而且它的符号告诉您该点在平面的哪一侧。 / p>
在片段着色器内部工作可能会使用NDC坐标。因此,也将A,B,C,D
转换为NDC。