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