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

Tho*_* An 0 c++ opengl

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

我们可以使用
{coordinate v1,normal vn3,color c1,texCoord vt4 } 构造一个顶点

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

请注意,"坐标数组"还不是顶点,它只提供构造顶点的位置.

在使用缓冲区和着色器的现代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}

Ret*_*adi 5

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

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

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

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

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