VBO 中普通数据的 OpenGL 排列

标签 opengl vbo

在阅读简单 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    

提前致谢

最佳答案

在 OpenGL 中,法线是矢量属性,就像位置或纹理坐标一样。

拥有每个面的法线可能看起来合理,但在实践中行不通。

原因:三角形实际上是平坦的,但通常是曲面的近似值。三角形顶点之间的法线向量不同,您可以在它们之间进行插值,以获得表面任意点处的近似法线向量。

将顶点法线视为平滑表面某些特定点处法线的样本。

(当然,当渲染具有硬边的表面(例如立方体)时,上述内容并没有真正帮助,并且许多要求您拥有仅与法线不同的重复顶点。)

关于VBO 中普通数据的 OpenGL 排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13538882/

相关文章:

c++ - 同时将单个缓冲区绑定(bind)到 SSBO 的多个索引目标

c++ - 如何使用 SDL 一次处理多个按键?

c++ - 使用 VAO/VBO 的 OpenGL 模型/纹理渲染

java - LWJGL 体素引擎 - VBO 上的纹理

c++ - 如何制作一个在使用时不会暂停我的程序的菜单?

c - 创建库时如何正确初始化GLEW?

c++ - OpenGL 离屏渲染

Java (LWJGL) - 在绘图之前/期间是否需要绑定(bind)特定的 VBO?

multithreading - 如何同步多线程 OpenGL 缓冲区访问?

android - Android 上的 OpenGL ES 2 : how to use VBOs