【问题标题】:Vizualizing vertex picking of a mesh in OpenGL在 OpenGL 中可视化网格的顶点拾取
【发布时间】:2017-03-28 22:15:57
【问题描述】:

为了好玩,我正在尝试使用(现代)OpenGL 构建一个微型搅拌机。作为其中的一部分,我希望用户能够选择顶点。每次用户选择一个顶点时,我都希望顶点变为红色。我的问题与找到相交的顶点无关,而是如何可视化选择的顶点。 我已经设法通过在我的片段着色器中使用以下内容来绘制拾取的三角形(而不是拾取的顶点):

if(gl_PrimitiveID==intersectingFace)
        color=vec4(1.0f,0.0f,0.0f,1.0f);

其中 intersectingFace 是一个制服,它包含网格相交面的索引。

为了选择一个顶点而不是一个面,我想将一个球体网格加载到我的场景中,将其缩小并将其中心平移到相交顶点的位置。我想知道是否有比这个更简单的解决方案。

【问题讨论】:

    标签: c++ opengl glsl


    【解决方案1】:

    有一个内置变量告诉您​​顶点的索引,而不是原始的:gl_VertexID

    gl_VertexID:当前正在处理的顶点的索引。
    什么时候 使用非索引渲染,是当前的有效索引 顶点(处理的顶点数+第一个值)。为了 索引渲染,它是用于从 缓冲区。

    注意:gl_VertexID 将应用基础顶点。

    因此,与其像现在这样设置相交面统一值,不如对顶点索引执行相同操作,然后将其与 gl_VertexID 进行比较。

    【讨论】:

    • 因为我使用三角形作为基元,所以我在提供的代码中所做的是将当前处理的片段(也称为三角形)的颜色设置为红色,如果它与 intersectingFace 匹配。如果片段着色器输出片段的颜色而不是顶点的颜色,如何设置顶点的颜色?
    • 是的,你说你有办法找到选定的顶点对吗?一旦您知道所选顶点是“面数 N”的“数字 2”,那么您的索引就是 3*N+2。您可以将其设置为“indexTarget”,如果 gl_VertexID == indexTarget 则将其设置为红色。这只是一个示例,您想要用作目标的有效索引值将受到您是否使用 GL_ELEMENT_ARRAY_BUFFER 和/或应用 basevertex 的影响。该链接解释了这一点
    • 据我所知(如果我错了,请纠正我)OpenGL 绘制图元,将图元顶点的颜色插值到图元内部的每个像素。如果我做了类似的事情: if(gl_vertexID==1) color=vec3(1.0f,0.0f,0.0f);在顶点着色器中,我不会得到一个红色的顶点。我会得到一个部分是红色的图元(因为片段颜色会插入顶点的颜色),这不是我想要的。我使用以下方法禁用插值:glShadeModel(GL_FLAT);但没有任何东西被涂成红色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多