Opengl es 使用OpenGL ES 2.0在glBufferData中加载顶点
我正在使用一个解析器来处理波阵面OBJ 3D对象文件,我不太确定我是否正确地加载到OpenGL中 所以基本上我要做的就是读取波前OBJ文件并解析所有数据 在OpenGL ES 1.1中,加载数据时通常会执行以下操作: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
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”标志时,我会检查缓存中是否有三元组
- 如果有这样的三元组,我会将该索引放在节点的索引中
- 如果没有,我需要创建新的索引
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);
}