Opengl es 使用OpenGL ES 2.0在glBufferData中加载顶点

Opengl es 使用OpenGL ES 2.0在glBufferData中加载顶点,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我正在使用一个解析器来处理波阵面OBJ 3D对象文件,我不太确定我是否正确地加载到OpenGL中 所以基本上我要做的就是读取波前OBJ文件并解析所有数据 在OpenGL ES 1.1中,加载数据时通常会执行以下操作: glBegin(GL_TRIANGLES); glNormal3f(normals[faces[i].normal[0]].v[0], normals[faces[i].normal[0]].v[1], normals[faces[i].normal[0]].v[2]); glVe

我正在使用一个解析器来处理波阵面OBJ 3D对象文件,我不太确定我是否正确地加载到OpenGL中

所以基本上我要做的就是读取波前OBJ文件并解析所有数据

在OpenGL ES 1.1中,加载数据时通常会执行以下操作:

glBegin(GL_TRIANGLES);
glNormal3f(normals[faces[i].normal[0]].v[0], normals[faces[i].normal[0]].v[1], normals[faces[i].normal[0]].v[2]);
glVertex3f(vertices[faces[i].vertex[0]].v[0], vertices[faces[i].vertex[0]].v[1], vertices[faces[i].vertex[0]].v[2]);
glNormal3f(normals[faces[i].normal[1]].v[0], normals[faces[i].normal[1]].v[1], normals[faces[i].normal[1]].v[2]);
glVertex3f(vertices[faces[i].vertex[1]].v[0], vertices[faces[i].vertex[1]].v[1], vertices[faces[i].vertex[1]].v[2]);
glNormal3f(normals[faces[i].normal[2]].v[0], normals[faces[i].normal[2]].v[1], normals[faces[i].normal[2]].v[2]);
glVertex3f(vertices[faces[i].vertex[2]].v[0], vertices[faces[i].vertex[2]].v[1], vertices[faces[i].vertex[2]].v[2]);
glEnd();
对于OpenGL ES 2.0,我已经尝试了以下顶点,但没有任何运气:

glBufferData(GL_ARRAY_BUFFER, obj.vertices.size()*sizeof(float), &(obj.vertices[0].v), GL_STATIC_DRAW);
我的数据结构:

struct vertex {
    std::vector<float> v;
}
如何像在2.0中使用OpenGL ES 1.1那样加载数据


甚至可以加载向量(
v
),而不是单独的位置(
float x,y,z
)?

有几个选项:

  • 为每个数据创建单独的VBO:一个用于位置,一个用于法线,等等
  • 创建具有交错数据的单个VBO—但这需要在代码中进行一些代码更改
对于开始,我建议使用一个缓冲区作为一个顶点属性+索引缓冲区:

索引缓冲区有一点:

  • 对于pos、normal和texture有单独的索引(直接从OBJ文件中获取这些值),但是如果想使用IBO(索引缓冲区对象)绘制几何体,则需要创建sinlge索引
下面是我的一些代码:

map<FaceIndex, GLushort, FaceIndexComparator>::iterator 
           cacheIndex = cache.find(fi);

if (cacheIndex != cache.end()) {
    node->mIndices.push_back(cacheIndex->second);   
}
else {
    node->mPositions.push_back(positions[fi.v]);
    node->mNormals.push_back(normals[fi.n]);
    node->mTexCoords.push_back(texCoords[fi.t]);
    node->mIndices.push_back((unsigned int)node->mPositions.size()-1);

    cache[fi] = ((unsigned int)node->mPositions.size()-1);
}
map::迭代器
cacheIndex=cache.find(fi);
if(cacheIndex!=cache.end()){
node->mIndices.向后推(cacheIndex->second);
}
否则{
节点->位置。向后推(位置[fi.v]);
node->mNormals.push_back(法线[fi.n]);
node->mTexCoords.push_back(texCoords[fi.t]);
node->mIndices.push_back((unsigned int)node->mPositions.size()-1);
cache[fi]=((unsigned int)节点->mPositions.size()-1);
}
它的作用是:

  • 它有一个向量用于每个位置,正常和特克斯坐标。。。但当OBJ文件中有“f”标志时,我会检查缓存中是否有三元组
  • 如果有这样的三元组,我会将该索引放在节点的索引中
  • 如果没有,我需要创建新的索引

这些代码是开源的吗?它看起来比我为OpenGL ES 2.0创建的要优雅得多。此外,你提到的第一个选择,你有一个特别的例子吗?谢谢。更多关于VBO的信息:,当然还有songho:
map<FaceIndex, GLushort, FaceIndexComparator>::iterator 
           cacheIndex = cache.find(fi);

if (cacheIndex != cache.end()) {
    node->mIndices.push_back(cacheIndex->second);   
}
else {
    node->mPositions.push_back(positions[fi.v]);
    node->mNormals.push_back(normals[fi.n]);
    node->mTexCoords.push_back(texCoords[fi.t]);
    node->mIndices.push_back((unsigned int)node->mPositions.size()-1);

    cache[fi] = ((unsigned int)node->mPositions.size()-1);
}