0

我有这个想法,但我对 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/xx/x/xx/x/x"

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

我的问题如下:

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

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

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

  4. Android 和其他风格的 OpenGL 中普遍接受的模型存储方法是什么?您将如何存储每个模型以将数据量减少到可能的最小大小?

我在这里先向您的帮助表示感谢。

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

4

1 回答 1

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);             

索引[] = fData[] 和 vertCoords[] = vData!

啊啊啊!

编辑:我刚刚发现了这个非常非常令人失望的消息,并想与大家分享;

引用自gamedevs.net。“_Walrus”说,

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

=(

于 2013-07-27T12:04:31.357 回答