如何在不切割网格几何的情况下渲染横截面?

时间:2017-03-24 05:32:57

标签: algorithm graphics rendering modeling

鉴于世界上有一个切片平面,我希望看到三角形,如果它们位于飞机的正面,那么 与平面相交的是分开的,也可以看到正平面上的部分。

如果每次更改平面时切割三角形网格,当有大量三角形时,它可能会非常慢,并且也会重新生成纹理坐标。

如果我仔细设置相机(视图)和投影,可能会产生类似的结果,但此结果取决于视图。

那么,是否有渲染技术可以利用GPU的剪切结果来渲染视图独立的横截面?

这样的横截面:img

1 个答案:

答案 0 :(得分:0)

使用着色器非常简单。在 Opengl / GLSL 中,您只需向片段着色器添加if语句,以确定您的片段是否位于您的平面的正确一侧,如果不是discard()它。

这将根据您的情况切割您的物体,这样您就可以获得轮廓。但是你仍然需要以某种方式从第二遍的深度缓冲区或使用模板缓冲区处理填充,但两者都只是覆盖整个屏幕的单GL_QUAD

要做到这一点的数学很简单,你需要定义你的半空间。我能想到的最简单的事情是:


p0=(x0,y0,z0) - 属于切割平面的3D点
n0=(nx,ny,nz) - 正常切割平面指向病房的侧面

所以如果

,任何片段p=(x,y,z)都可见
dot_product(p-p0,n0) >= 0.0

所以

if (nx*(x-x0)+ny*(y-y0)+nz*(z-z0)<0.0f) discard();

不要忘记禁用GL_CULL_FACE并使用双面matherials /照明。所有坐标也必须在同一个坐标系中!!!