Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android版OpenGLES2.0中的模型数据简化_Java_Android_Memory_Opengl Es - Fatal编程技术网

Java Android版OpenGLES2.0中的模型数据简化

Java Android版OpenGLES2.0中的模型数据简化,java,android,memory,opengl-es,Java,Android,Memory,Opengl Es,我有这个想法,但我对VBO和FloatBuffers了解不够,不知道它是否有效。为了减少程序中的数据量,我想到将面部数据作为单个字符串保存,并在渲染时用string.split(“/”)将其拆分。这将从我的数据中删除所有冗余顶点,就像WaveFront.OBJ文件一样。我认为,它只会放慢GPU的速度,每次它画一张脸,而大大减少了我的模型尺寸。但是,VBO和FloatBuffers(打包和解包)采用一致的顶点数据数组,以单个浮点[]表示。似乎OGLES2.0希望所有数据都按顺序放在一个缓冲区中。所

我有这个想法,但我对VBO和FloatBuffers了解不够,不知道它是否有效。为了减少程序中的数据量,我想到将面部数据作为单个字符串保存,并在渲染时用string.split(“/”)将其拆分。这将从我的数据中删除所有冗余顶点,就像WaveFront.OBJ文件一样。我认为,它只会放慢GPU的速度,每次它画一张脸,而大大减少了我的模型尺寸。但是,VBO和FloatBuffers(打包和解包)采用一致的顶点数据数组,以单个浮点[]表示。似乎OGLES2.0希望所有数据都按顺序放在一个缓冲区中。所以,我的想法似乎站不住脚

例:

裁员:

缓冲区={x1,x2,x3…x30000}

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

没有:

缓冲区={x1,x2,x3…x1000}

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

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

我的问题如下:

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

  • 如果没有,我的限制是什么?在添加冗余之前,我有一个大约有1000个顶点的模型。在Android中,VBO或FloatBuffer能否处理这么多顶点(具有冗余)?在内存耗尽之前,我可以一次渲染多少个模型

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

  • 在Android和OpenGL的其他版本中,什么是公认的模型存储方法?如何存储每个模型,以便将数据量减少到尽可能小的大小

  • 提前谢谢你的帮助


    编辑:5。这些元素能解决我的问题吗?现在我正在使用gldraw数组。我刚刚在某个地方读到一篇文章,这篇文章让我相信,当存在冗余顶点时,GLD元素会更好。这是对的吗?

    我找到了我要找的东西。答案确实是使用元素。使用GLDraweElements,可以将唯一的顶点指定给FloatBuffer或VBO,然后将面数据指定给FloatBuffer或VBO。gldrawerelements接受这两个缓冲区并为您完成工作

    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[]和顶点坐标[]=vData

    塔阿达

    编辑:我刚刚发现这个非常非常令人失望的消息,我想我会和你们大家分享它

    引自gamedevs.net。“海象”说

    如果要从绘制数组方法中减少共享垂直(即,删除冗余垂直),则会遇到问题,因为无法为该顶点指定多个纹理坐标。我想用立方体更容易解释。对于立方体,顶点重复3次(即角点)。因此立方体的每个面都有完全相同的顶点(从几何角度来说),但每个面可能有不同的tex坐标。当你在移动到索引列表时减少约简,那么你就会遇到一个顶点的多个tex坐标的问题。Opengl不支持一个顶点的多个texCoord(关于索引列表),也不支持任何其他数组(即法线、颜色…)。所以我猜规则是:当毁灭你的几何体时,只移除共享的、法线、位置、texCoord…等的冗余垂直

    =(