我想利用着色器,不仅放弃碎片,如果他们是在一个预定义的平面的一侧,但也渲染一个轮廓沿着相交。
我的片段着色器目前做的事情沿着行:
float dot = dot(world_coordinate, normalize(clipping_normal.xyz)) - clipping_normal.w;
if (dot > 0.0f)
discard;
字符串
这工作,但没有所需的轮廓。我试图比较点积对值接近0. 0,但这导致轮廓与不同的宽度取决于视图等。
这就是我试图实现的。请注意,平面与球体相交处的白色轮廓/边缘具有一致的宽度:
x1c 0d1x的数据
下面是我目前看到的结果:
的
使用片段着色器:
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);
}
型
1条答案
按热度按时间r1zk6ea11#
交点的轮廓也属于剪裁平面,因此到该平面的距离为零。
使用
dot(point, normal)
是不够的。您需要d= A·x + B·y + C·z + D
,它是全距离点到平面公式的分子(没有“模数”)。参见plane geometry。计算出的
d
不仅给出了距离(如果法线A、B、C不是幺正的,则在分母中加上平方),而且其符号告诉您点在平面的哪一侧。在片段着色器中工作,你可能会使用NDC坐标。所以也要将
A,B,C,D
转换为NDC。