opengl 显示剪切平面和剪切对象之间的边

a64a0gku  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(174)

我想利用着色器,不仅放弃碎片,如果他们是在一个预定义的平面的一侧,但也渲染一个轮廓沿着相交。
我的片段着色器目前做的事情沿着行:

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);
}

r1zk6ea1

r1zk6ea11#

交点的轮廓也属于剪裁平面,因此到该平面的距离为零。
使用dot(point, normal)是不够的。您需要d= A·x + B·y + C·z + D,它是全距离点到平面公式的分子(没有“模数”)。参见plane geometry
计算出的d不仅给出了距离(如果法线A、B、C不是幺正的,则在分母中加上平方),而且其符号告诉您点在平面的哪一侧。
在片段着色器中工作,你可能会使用NDC坐标。所以也要将A,B,C,D转换为NDC。

相关问题