我可以设置openGL缓冲区来处理与OBJ文件类似的原理吗?

时间:2015-07-09 02:57:05

标签: c++ opengl

假设我有以下数组(每个数组都有任意长度)并将它们用作备件箱;将它们中的每一个放入缓冲区,然后让openGL读取elements数组中的索引,并通过从每个数组块中挑选来构造顶点。

我们可以使用
构造一个顶点 {coordinate v1 ,普通 vn3 ,颜色 c1 ,texCoord vt4 }

或者我们可以使用
构造另一个顶点 再次{coordinate v1 ,再次正常 vn3 ,颜色 c3 ,texCoord vt2 }

请注意,“coordinates array”还不是顶点,它只提供构造顶点的位置。

在使用缓冲区和着色器的现代openGl中,对于初学者来说,这样的事情会非常困难吗?

CoordinatesArray
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000

NormalsArray
vn 0.000000 0.000000 -1.000000
vn -1.000000 -0.000000 -0.000000
vn -0.000000 -0.000000 1.000000
vn -0.000001 0.000000 1.000000
vn 1.000000 -0.000000 0.000000
vn 1.000000 0.000000 0.000001

ColorsPallete
c 1.0,1.0,1.0
c 0.0,1.0,0.0
c 0.2,0.3,0.2

TextureCoordArray
vt 0.748573 0.750412
vt 0.749279 0.501284
vt 0.999110 0.501077
vt 0.999455 0.750380
vt 0.250471 0.500702
vt 0.249682 0.749677
vt 0.001085 0.750380
vt 0.001517 0.499994
vt 0.499422 0.500239
vt 0.500149 0.750166
vt 0.748355 0.998230
vt 0.500193 0.998728
vt 0.498993 0.250415
vt 0.748953 0.250920

IndexRecipiesArray
f {1,2,1,4},{2,2,1,4},{3,2,1,4}
f {2,2,1,4},{3,2,1,4},{4,2,1,4}
f {4,5,1,4},{5,2,1,4},{6,2,1,4}
f {6,2,1,4},{7,2,1,4},{8,2,1,4}
f {1,2,1,4},{1,2,1,4},{1,2,1,4}

1 个答案:

答案 0 :(得分:5)

这已经多次以类似的形式出现。但我无法找到完全相同的副本,所以无论如何我都会回答它。

OpenGL不直接支持此功能。它只能有一个索引数组,这意味着每个唯一的属性组合都需要一个顶点。

有一个非常接近的扩展名:AMD_interleaved_elements。它确实引入了每属性索引的概念。但是使用它有几个问题:

  • 顾名思义,它是特定于供应商的。因此,您无法将其用作您支持的唯一渲染路径,除非您只能使用有限的硬件集合来处理代码。
  • 它有严重的限制。它仅支持两个16位索引或四个8位索引。由于两个索引对于您描述的情况是不够的,因此每次绘制调用将限制为256个顶点。对于任何有趣的事情来说,这都是不够的。

因此,典型的方法是在将顶点数据提供给OpenGL之前,在自己的代码中生成唯一的属性组合和相应的索引。我在回答这个问题时发布了一些伪代码:OpenGL - Index buffers difficulties