如何在不切割网格几何体的情况下渲染横截面?
How to Render Cross Section without Slicing the Mesh Geometry?
给定世界上的一个切片平面,如果三角形在平面的正侧,我希望看到三角形,那些在正侧的三角形
与平面的相交被分割,正平面的部分也能看到。
如果我每次换平面的时候都切片三角形网格,当三角形很多的时候可能会很慢,纹理坐标也会重新生成。
如果我仔细设置相机(视图)和投影,它可能会产生类似的结果,但这个结果取决于视图。
那么,有没有渲染技术可以利用GPU的裁剪结果来渲染视图独立横截面?
截面像这样:
使用着色器真的很容易。在 Opengl/GLSL 中,您只需向片段着色器添加一个 if
语句,确定您的片段是否在平面的正确一侧,如果不在,则 discard
它.
这将根据您的条件切割您的对象,以便您获得轮廓。但是,您仍然必须以某种方式处理可能来自第二遍深度缓冲区或使用模板缓冲区的填充,但两者都只是覆盖整个屏幕的单个 GL_QUAD
。
计算起来很简单,您需要定义一半 space。我能想到的最简单的事情是:
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/lighting。另外所有的坐标必须在同一个坐标系中!!!
给定世界上的一个切片平面,如果三角形在平面的正侧,我希望看到三角形,那些在正侧的三角形 与平面的相交被分割,正平面的部分也能看到。
如果我每次换平面的时候都切片三角形网格,当三角形很多的时候可能会很慢,纹理坐标也会重新生成。
如果我仔细设置相机(视图)和投影,它可能会产生类似的结果,但这个结果取决于视图。
那么,有没有渲染技术可以利用GPU的裁剪结果来渲染视图独立横截面?
截面像这样:
使用着色器真的很容易。在 Opengl/GLSL 中,您只需向片段着色器添加一个 if
语句,确定您的片段是否在平面的正确一侧,如果不在,则 discard
它.
这将根据您的条件切割您的对象,以便您获得轮廓。但是,您仍然必须以某种方式处理可能来自第二遍深度缓冲区或使用模板缓冲区的填充,但两者都只是覆盖整个屏幕的单个 GL_QUAD
。
计算起来很简单,您需要定义一半 space。我能想到的最简单的事情是:
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/lighting。另外所有的坐标必须在同一个坐标系中!!!