在OpenGL中虚拟化网格的顶点拾取

时间:2017-03-28 14:01:54

标签: c++ opengl glsl

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

{{1}}

其中intersectingFace是一个保持网格交叉面索引的制服。

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

1 个答案:

答案 0 :(得分:0)

有一个内置变量可以告诉你Vertex的索引,而不是原语:gl_VertexID

  

gl_VertexID :当前正在处理的顶点的索引。
当   使用非索引渲染,它是当前的有效索引   顶点(处理的顶点数+第一个值)。对于   索引渲染,它是用于从中获取此顶点的索引   缓冲液中。

     

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

因此,不是像现在这样设置相交面均匀值,而是可以对顶点索引执行相同操作,然后将其与#!/usr/bin/env python3 import sys from fontTools.ttLib import TTFont font = TTFont(sys.argv[1], 0, allowVID=0, ignoreDecompileErrors=True, fontNumber=0, lazy=True) I_cp = ord('I') M_cp = ord('M') I_glyphid = None M_glyphid = None for table in font['cmap'].tables: for codepoint, glyphid in table.cmap.items(): if codepoint == I_cp: I_glyphid = glyphid if M_glyphid: break elif codepoint == M_cp: M_glyphid = glyphid if I_glyphid: break if (not I_glyphid) or (not M_glyphid): sys.stderr.write("Non-alphabetic font %s, giving up!\n" % sys.argv[1]) sys.exit(3) glyphs = font.getGlyphSet() i = glyphs[I_glyphid] M = glyphs[M_glyphid] if i.width == M.width: sys.exit(0) else: sys.exit(1) 进行比较。