我可以使用顶点着色器显示模型法线吗?

时间:2009-10-23 22:31:20

标签: opengl shader vertex

我正在使用VBO作为纹理坐标,法线和(3DS)模型的顶点,我用“glDrawArrays(GL_TRIANGLES,...);”绘制。对于调试,我想(暂时)在绘制模型时显示法线。我是否必须使用立即模式从vert到vert绘制每条线+ normal -OR-填充另一个带有vert和vert + normal的VBO以绘制所有法线... -OR-是否有一种方法可以让顶点着色器使用顶点绘制模型时已经传入的正常数据是为了计算绘制法线时使用的V + N吗?

3 个答案:

答案 0 :(得分:6)

不,无法从顶点着色器绘制其他线条。

顶点着色器不是关于创建几何体,而是关于每个顶点计算。使用顶点着色器,当您说glDrawArrays(GL_TRIANGLES,0,3)时,这就是指定您将要绘制的内容,即1个三角形。处理到达顶点着色器后,您只能更改该三角形的顶点的属性,而不能以任何方式,形状或形式,几何体的拓扑和/或计数进行修改。

您正在寻找的是 OpenGL 3.2定义为几何着色器,它允许从着色器输出任意几何计数/拓扑。但是请注意,这只能通过OpenGL 3.2支持,现在支持的卡/驱动程序并不多(现在已经出现了几个月)。

但是,我必须指出,显示法线(在大多数支持某种调试的引擎中)通常使用传统的线渲染完成,其中一个额外的顶点缓冲区用适当的位置填充(P,P + C * N)表示每个网格位置,其中C是一个常量,表示要用于显示法线的长度。写起来并不复杂......

答案 1 :(得分:1)

您可以通过绘制几何图形来近似此值。一旦你像往常一样画出它。第二次,将几何体绘制为GL_POINTS,并附加顶点着色器,该顶点着色器通过顶点法线偏移每个顶点位置。

这会导致您的模型在表面上浮动一组点。每个点都会显示它对应的顶点的法线方向。

这不是完美的,但可能就足够了,这取决于你希望用它做什么。

更新: AHA!如果你将一个恒定的比例因子传递给顶点着色器,并让你的应用程序随着时间的推移内插该因子在0和1之间,那么顶点着色器渲染的点将随着时间的推移动画,从它们应用的顶点开始,然后沿正常方向漂浮。

答案 2 :(得分:0)

使用巧妙编写的顶点着色器可能会或多或少地获得正确的效果,但这需要做很多工作。既然这是出于调试目的,最好只绘几行;性能打击不会很严重。