我读的越多,我就越困惑。我正在努力学习从旧opengl1
固定管道到现代gl。我已经学到了很多,但有一件事我仍然不确定。在旧教程中,它仅用作gl_Normal
,较新版本通常称为vnormal
或v_normal
。
在旧版本中,我不需要关心它,也在固定管道中,它似乎是自动提供的。那么在哪里得到这个或者更确切地说,如何计算它?必须在c ++中完成,还是可以在顶点或片段着色器中从顶点位置完成(在旧教程中称为gl_Vertex
)?
示例或伪代码会很好。
答案 0 :(得分:2)
正常从未自动发生。即使使用固定管道,您也必须自己提供法线。
gl_Normal
是来自glNormalPointer
的预定义顶点着色器属性。在最新的GL中(不确定实际版本,可能是4. *)这些函数已被弃用,因此所有属性必须来自glVertexAttribPointer
- 没有预定义的属性,程序员必须将每个数组绑定到属性位置本身。
所以normal
或其所谓的任何东西都只是命名属性。您必须获取其位置(使用glGetAttribLocation
)并将包含顶点法线的数组(在指定顶点处的法线指向sufrace)分配给该位置。
至于计算法线 - 对于平面(仅仅是两个三角形边的交叉积)来说是微不足道的,但是对于平滑着色 - 法线必须在最近的多边形之间插值。它通常在3D网格编辑器中完成,只是导出到文件。