修复了glsl gl_Normal / vnormal / v_normal的管道

时间:2014-03-15 10:36:02

标签: c++ opengl glsl

我读的越多,我就越困惑。我正在努力学习从旧opengl1固定管道到现代gl。我已经学到了很多,但有一件事我仍然不确定。在旧教程中,它仅用作gl_Normal,较新版本通常称为vnormalv_normal

在旧版本中,我不需要关心它,也在固定管道中,它似乎是自动提供的。那么在哪里得到这个或者更确切地说,如何计算它?必须在c ++中完成,还是可以在顶点或片段着色器中从顶点位置完成(在旧教程中称为gl_Vertex)?

示例或伪代码会很好。

1 个答案:

答案 0 :(得分:2)

正常从未自动发生。即使使用固定管道,您也必须自己提供法线。

gl_Normal是来自glNormalPointer的预定义顶点着色器属性。在最新的GL中(不确定实际版本,可能是4. *)这些函数已被弃用,因此所有属性必须来自glVertexAttribPointer - 没有预定义的属性,程序员必须将每个数组绑定到属性位置本身。

所以normal或其所谓的任何东西都只是命名属性。您必须获取其位置(使用glGetAttribLocation)并将包含顶点法线的数组(在指定顶点处的法线指向sufrace)分配给该位置。

至于计算法线 - 对于平面(仅仅是两个三角形边的交叉积)来说是微不足道的,但是对于平滑着色 - 法线必须在最近的多边形之间插值。它通常在3D网格编辑器中完成,只是导出到文件。