适用于Android的OpenGLES2.0中的模型数据缩减

时间:2013-07-27 07:56:24

标签: java android memory opengl-es

我有这个想法,我不了解VBO和FloatBuffers是否有效。为了减少程序中的数据,我有了将面部数据保存为单个字符串的想法,并在渲染时使用String.split(“/”)将其分解。这将从我的数据中删除所有冗余顶点,就像WaveFront .OBJ文件一样。我认为每次绘制面部时它只会减慢GPU的速度,同时大大减少了我的模型尺寸。但是,VBO和FloatBuffers(打包和解包)都采用一致的顶点数据数组,以单个float []表示。似乎OGLES2.0按顺序想要一个缓冲区中的所有数据。所以,我的想法似乎没有成功。

例如:

有裁员:

缓冲区= {x1,x2,x3 ... x30,000}

(按顺序绘制所有面,一次全部)

缓冲区= {x1,x2,x3 ... x1,000}

fData [x] =“x / x / x x / x / x x / x / x”

(根据fData [x]中的引用绘制每个面,一次一个)

我的问题如下:

  1. 是否适合在缓冲区中省略冗余顶点并使用.OBJs fData在渲染时组合面?为什么或为什么不呢?

  2. 如果没有,我有什么限制?在添加冗余之前,我有一个包含大约1,000个顶点的模型。 VBO或FloatBuffer可以在Android中处理那么多顶点(有冗余)吗?在内存不足之前,我可以一次渲染多少这些模型?

  3. 如果是这样,您如何建议我让OGLES2.0知道我的数据在每个面的缓冲区中的位置? Buffer.setPosition(x)的

  4. Android和其他各种OpenGL中普遍接受的模型存储方法有哪些?您如何存储每个模型以便将数据量减少到可能的最小尺寸?

  5. 感谢您的帮助。

    编辑:5。glDrawElements会解决我的问题吗?现在我正在使用glDrawArrays。我刚读了一篇文章,让我相信当冗余顶点存在时glDrawElements会更好。这是对的吗?

1 个答案:

答案 0 :(得分:0)

我找到了我要找的东西。答案确实是使用glDrawElements。使用glDrawElements,将唯一顶点分配给FloatBuffer或VBO,然后将面数据分配给FloatBuffer或VBO。 glDrawElements采用这两个缓冲区并为您完成工作。

float vertsCoords[] = {0.5f, 0.5f, 0.5f,          //V0
                                  -0.5f, 0.5f, 0.5f,           //V1
                                  -0.5f, -0.5f, 0.5f,         //V2
                                   0.5f, -0.5f, 0.5f,         //V3
                                   0.5f, -0.5f, -0.5f,       //V4
                                   0.5f,  0.5f, -0.5f,       //V5
                                  -0.5f, 0.5f, -0.5f,       //V6
                                  -0.5f, -0.5f, -0.5f,     //V7
                    }; 
GLubyte indices[] = {0, 1, 2, 3,              //Front face
                            5, 0, 3, 4,             //Right face
                            5, 6, 7, 4,             //Back face
                            5, 6, 1, 0,             //Upper face
                            1, 6, 7, 2,              //Left face
                            7, 4, 3, 2,             //Bottom face
                  }; 

glEnableClientState(GL_VERTEX_ARRAY);       
glVertexPointer(3, GL_FLOAT, 0, vertsCoords);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, indices);             

indices [] = fData []和vertCoords [] = vData!

Taaadaaa!

编辑:我刚刚发现了这个非常非常令人失望的消息,并认为我与y&all;分享了这些消息;

引自gamedevs.net。 " _Walrus"说,

如果要从绘图数组方法中减少共享顶点(即删除多余的顶点),那么您将遇到问题,因为您无法指定多个texCoords到该顶点。我想用立方体更容易解释。使用立方体,顶点重复3次(即角落)。因此,立方体的每个面都将具有完全相同的顶点(几何上讲),但每个面可能具有不同的tex坐标。当你在移动到索引列表时减少reducency然后你遇到一个顶点的多个tex coord的问题。 Opengl不支持多个texCoord用于一个顶点(相对于索引列表),也不支持任何其他数组(即法线,颜色......)。所以我猜这个规则是:在抽取ur几何体时,只删除共享,法线,位置,texCoord..etc的冗余顶点。

=(