OpenGL中的面上线

2024-09-27 00:13:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在三角形网格上定义了一个函数f,也就是说,对于每个顶点,我都有一个相关的数字。例如,f可以是网格上的测地距离,即f(x)=d(a,x),从特定的固定点a计算网格中的每个点。 显然,很容易在曲面上“绘制”这个函数,只需将f值规范化并将其映射到网格节点上的颜色。在

但是如果我想在曲面上绘制等值线(也称为contour lines或等参线)呢?

我该怎么做?这似乎不容易做到简单的着色网格如上。特别是由于网格可能具有具有很少顶点的稀疏区域(即大面)。这建议(也许)我应该直接计算等值线作为网格上的三维曲线,并使用例如GL线。但是计算等高线曲线并不那么明显,因为朴素的方法是固定一组目标值,然后我将通过插值检查每个三角形是否在三角形上的某个点到达目标,这看起来并不理想。有人能给我指出解决这个问题的资源吗?在

作为参考,我使用python OpenGL。在


Tags: 函数网格距离节点定义颜色绘制数字
2条回答

假设您要绘制Z坐标为ci(对于“等高线间隔”)的倍数的等高线(等值线)。例如,对于ci=5,有效值为25、30、35等。
一个三角形可以没有、一个或多个等高线与之相交。我不在乎台词。我使用点,我检查碎片着色器中的每个片段。在

第一个目标是在片段着色器中获取片段的世界坐标。
片段着色器接收gl_FragCoord,它在屏幕坐标中有{x,y,z}。或者在顶点着色器中,您可以使用z传递一个变化。阅读this q&a以了解如何进行此转换。在

现在在世界坐标系中有一个z,现在是时候判断它是否属于轮廓了:

float maxErr = 0.0001;
float dif = abs(z - (ci * floor(z/ci)));
if ( dif > maxErr )
    color = triangleColor;
else
    color = contourColor;

因为一个片段和一个像素不同,你可能会得到一条非宽度常量线。在

如果该值是float,并且您知道它的范围,那么可以尝试使用上面的fragment shader进行着色,这样只会渲染非常接近渲染值的片段。在

最简单的方法是使用单个渲染过程在片段中使用类似以下内容:

float x;
x = (value/10.0)+0.5; // 10 is distance of value you want the lines to render
x = x-floor(x);   // x = value mod distance
if (abs(x-0.5)>0.001) discard; // do not render fragments too far from your line

代码只需判断您是否非常接近该值的每一个距离=10,并丢弃任何不是的片段。但是,直线/曲线的厚度可能会根据值密度和三角形大小分布而变化。必须正确设置常量(distance=10,threshold=0.001)才能使其工作。在

{这是一种非常相似的连续的方法。在

更准确的选择是在两次渲染中使用相同的原理。在第一个过程中,将值作为颜色渲染到某个纹理中。然后在第二个片段中,扫描周围的纹理,找到可渲染值的最近位置,然后根据到它的距离进行渲染或不渲染。这将提供精确的线条粗细。但为此,该值必须包含特定的可渲染值。这个How to implement 2D raycasting light effect in GLSL可能会有所帮助,因为它也会扫描纹理的所有方向(但目的不同)。在

如果上面的方法都不适合你,那么我想到的唯一的选择就是几何方法,即根据与网格的值相交(如与平面的横截面),从网格创建多段线。在

相关问题 更多 >

    热门问题