在阅读简单的VBO程序示例时,我注意到普通数据与顶点数据似乎存在关联。但是从正常的定义来看,我认为正常数据应该与面部数据相关联。
从下面的代码段我可以注意到每个MyVertex的正常数据是相同的,所以“三角形面”的法线是有意义的。但我不确定如何存储较大对象的普通数据,其中多个面可能共享与GL_ELEMENT_ARRAY_BUFFER中存储的相同顶点。
问题: OpenGL如何在概念上处理普通数据?或者我对法线应该如何在某处工作做出了错误的假设?
(http://www.opengl.org/wiki/VBO_-_just_examples下面的代码)
struct MyVertex
{
float x, y, z; //Vertex
float nx, ny, nz; //Normal
float s0, t0; //Texcoord0
};
MyVertex pvertex[3];
//VERTEX 0
pvertex[0].x = 0.0;
pvertex[0].y = 0.0;
pvertex[0].z = 0.0;
pvertex[0].nx = 0.0;
pvertex[0].ny = 0.0;
pvertex[0].nz = 1.0;
pvertex[0].s0 = 0.0;
pvertex[0].t0 = 0.0;
//VERTEX 1
提前致谢
答案 0 :(得分:2)
在OpenGL中,法线是矢量属性,就像位置或纹理坐标一样。
表面看似正常似乎是合理的,但在实践中不起作用。
原因:一个三角形是物理上平坦的,但通常是曲面的近似值。在三角形的顶点之间具有不同的法线向量允许您在它们之间进行插值,以在表面的任何点处获得近似的法向量。
将顶点法线视为光滑曲面某些特定点处法线的样本。
(当然,当渲染具有硬边的表面时,如立方体,上面并没有真正帮助,许多要求你有重复的顶点只有法线不同。)