OpenGLES 与 WebGL 中顶点属性的组织格式的误解 - 一个不好笑的笑话
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
WebGL 中立方体顶点坐标数组:
vertices = [ // Front face -3.0, -3.0, 3.0, 3.0, -3.0, 3.0, 3.0, 3.0, 3.0, -3.0, 3.0, 3.0, // Back face -3.0, -3.0, -3.0, -3.0, 3.0, -3.0, 3.0, 3.0, -3.0, 3.0, -3.0, -3.0, // Top face -3.0, 3.0, -3.0, -3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, -3.0, // Bottom face -3.0, -3.0, -3.0, 3.0, -3.0, -3.0, 3.0, -3.0, 3.0, -3.0, -3.0, 3.0, // Right face 3.0, -3.0, -3.0, 3.0, 3.0, -3.0, 3.0, 3.0, 3.0, 3.0, -3.0, 3.0, // Left face -3.0, -3.0, -3.0, -3.0, -3.0, 3.0, -3.0, 3.0, 3.0, -3.0, 3.0, -3.0, ];
WebGL 中立方体面顶点坐标索引数组:
var cubeVertexIndices = [ 0, 1, 2, 0, 2, 3, // Front face 4, 5, 6, 4, 6, 7, // Back face 8, 9, 10, 8, 10, 11, // Top face 12, 13, 14, 12, 14, 15, // Bottom face 16, 17, 18, 16, 18, 19, // Right face 20, 21, 22, 20, 22, 23 // Left face ];
iOS 中与上面的差别:
一是顶点坐标数组中有重复的三角形顶点组合;
二是面顶点坐标数组中仅是顶点坐标,未提供该点取纹理像素的坐标,也未提供灯光照射到该到上时光线反射计算的法线坐标;不过,WebGL 中分别提供了两个与顶点坐标数组对应的数组,分别对应顶点坐标数组中每个顶点坐标配对的纹理坐标和法线坐标;
茫然一阵后,放下,再捡起来,从稍外一层来看这个问题,
首先,对于使用顶点索引式绘制时,实际绘制是从面顶点索引缓存中来找绘制顺序,而顶点坐标缓存只是一个容器,并不决定顺序;
其次,使用顶点索引缓存的目的,就是避勉重复的顶点坐标存于缓存中,而代以坐标的索引的重复,大幅度降低了对 GPU 内存的占用;
最后,其实这是一个别人的测试代码,顶点坐标数组之所以那样存储,一是针对不使用索引方式绘制时使用,这叫做复用吗?哈哈,看您怎么理解了,方便呗,至少原作者非常的清楚其中的运行机理,所以敢于这样来写,以简化其测试的目的,这也给俺设了个难题,也正因为这个难题,让我深入理解了一些东西。二是,我好像看到它是用的四个点来表示一个未使用索引方式绘制的面?有木有?俺未做过 OpenGL 的四边形的东东,不太好说,行家们可能看得出来吧,至少不是 OpenGLES 的,这个在我了解的范围人,俺敢肯定!但,您别忘了,俺了解的范围,俺都不知道多还是少,所以您就别肯定了,还是再咨询下室外高人吧。
笑话讲完了,其实真的不好笑,不过俺刚明白的时侯,确实大气不出,小气不断地哼了几声,出人意料到是,元芳,你怎么看?有木有!