自从OpenGL尝试任何东西以来,我已经有几年了!我已经基于使用OpenGLES 2.0的默认模板松散地破解了面向对象的iOS应用程序,并且还使用了Shaders但是我正在尝试加载我曾经称之为的模型:
#import "./sphere_model.h"
glVertexPointer(3, GL_FLOAT, 0, sphere_modelVerts);
glNormalPointer(GL_FLOAT, 0, sphere_modelNormals);
glDrawArrays(GL_TRIANGLES, 0, sphere_modelNumVerts);
我之前使用上述代码的原因是因为我将.obj
文件转换为一个文件,我可以将其包含在我需要定义的所有数组中(参见obj2opengl)。现在,我不是百分之百,但我读到glVertexPointer
被弃用的地方,我很难在我的演示应用程序中使用它。目前我正在绘制这个简单的立方体:
我从中使用glVertexAttribPointer
取代OpenGL着色器代码的模板与使用的顶点数组略有不同,因为它包含同一数组中的法线:
GLfloat gCubeVertexData[216] =
{
// Data layout for each line below is:
// positionX, positionY, positionZ, normalX, normalY, normalZ,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
....
};
我使用此代码绘制多维数据集(加载着色器文件后):
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
glUseProgram(GetProgram());
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
glDrawArrays(GL_TRIANGLES, 0, 36);
glDisableVertexAttribArray(GLKVertexAttribNormal);
glDisableVertexAttribArray(GLKVertexAttribPosition);
glBindVertexArrayOES(0);
现在我的问题是,使用Open GLES 2.0,是否可以在使用着色器时使用obj2opengl
而不是glVertexAttribPointer
加载前面提到的glVertexPointer
定义的顶点?
以下是其中一个模型文件的一些示例:
unsigned int sphere_modelNumVerts = 864;
float sphere_modelVerts [] = {
-1.93077099209747e-18, 0.49025, 0.098,
0.098, 0.49025, -1.78225014655151e-18,
-1.93077099209747e-18, 0.5, -1.78225014655151e-18,
-1.93077099209747e-18, 0.44725, 0.2235,
0.11775, 0.4715, 0.11775,
-1.93077099209747e-18, 0.49025, 0.098,
...
}
float sphere_modelNormals [] = {
0, 0.980579906452681, 0.196119981290155,
0.196119981290155, 0.980579906452681, 0,
0, 1, 0,
0, 0.894429190989163, 0.447209595499104,
...
}
float sphere_modelTexCoords [] = {
0.75000, 0.0628300000000001,
1, 0.0628300000000001,
0.87500, 0,
0.75000, 0.14758,
...
}
答案 0 :(得分:3)
使用数组结构。绘制多维数据集的代码示例使用交错的顶点数据。它也被称为结构数组。这是recommended layout。
为了支持您的数据格式,只需为每个属性创建单独的缓冲区(sphere_modelVerts,sphere_modelNormals ...)并定义没有偏移的属性。