我可以使用顶点着色器来显示模型法线吗?
Posted
技术标签:
【中文标题】我可以使用顶点着色器来显示模型法线吗?【英文标题】:Can I use a vertex shader to display a models normals? 【发布时间】:2009-10-23 22:31:20 【问题描述】:我目前正在使用 VBO 来绘制我使用“glDrawArrays(GL_TRIANGLES, ...);”绘制的 (3DS) 模型的纹理坐标、法线和顶点。为了调试,我想(暂时)在绘制模型时显示法线。我是否必须使用立即模式来绘制从顶点到顶点+法线的每条线 - 或者 - 用顶点和顶点 + 法线填充另一个 VBO 以绘制所有法线...... - 或者 - 顶点着色器有没有办法使用顶点和绘制模型时已经传入的法线数据来计算绘制法线时使用的V+N?
【问题讨论】:
【参考方案1】:不,不能从顶点着色器中绘制额外的线。
顶点着色器不是关于创建几何体,而是关于每个顶点的计算。使用顶点着色器,当您说glDrawArrays(GL_TRIANGLES,0,3)
时,这就是您要绘制的确切内容,即 1 个三角形。一旦处理到达顶点着色器,您只能更改该三角形的顶点属性,而不能以任何方式修改形状或形式、几何形状的拓扑和/或计数。
您正在寻找的是 OpenGL 3.2 定义为几何着色器,它允许从着色器输出任意几何计数/拓扑。但是请注意,这仅通过 OpenGL 3.2 支持,目前支持的卡/驱动程序并不多(现在已经发布了几个月)。
但是,我必须指出,显示法线(在大多数支持某种调试的引擎中)通常是通过传统的线渲染完成的,额外的顶点缓冲区填充了正确的位置(P,P+ C*N) 用于每个网格位置,其中 C 是一个常数,表示要用于显示法线的长度。写起来没那么复杂……
【讨论】:
几何着色器:这就是我要找的……谢谢!【参考方案2】:您可以通过绘制几何图形两次来近似此值。一旦像往常一样绘制它。第二次,将几何图形绘制为 GL_POINTS,并附加一个顶点着色器,该着色器将每个顶点位置偏移顶点法线。
这会导致您的模型在表面上有一组浮动点。每个点都会显示法线从它对应的顶点开始的方向。
这并不完美,但可能就足够了,具体取决于您希望将其用于什么目的。
更新:啊哈!如果您将一个恒定的缩放因子传递给顶点着色器,并让您的应用程序随着时间的推移将该因子插值在 0 和 1 之间,那么您由顶点着色器渲染的点将随着时间的推移进行动画处理,从它们应用到的顶点开始,然后向其法线方向漂浮。
【讨论】:
【参考方案3】:使用巧妙编写的顶点着色器可能或多或少地获得正确的效果,但这需要大量工作。由于无论如何这都是出于调试目的,因此最好只画几行;性能损失不会很严重。
【讨论】:
在完成所有工作以将所有文本坐标、法线和顶点放入 VBO 之后,似乎需要做很多工作才能再次看到法线……我们不是在谈论几行……更像是 10K+。希望有一个更简单的(临时)解决方案……感谢您的回复。 ;-) @geowar: 10k 行源代码?你对需要这么多代码的模型做了什么?无论如何,我不明白为什么这很重要;只需将顶点和法线从您传递给 glDrawArrays() 的数组中拉出,进入线模式,然后绘制一堆线。 不是 10K 行的源代码; VBO 中已有 10K+ 数据点。使用几何着色器允许重新使用 VBO 数据来绘制法线(用于调试)。以上是关于我可以使用顶点着色器来显示模型法线吗?的主要内容,如果未能解决你的问题,请参考以下文章