ios - 使用glVertexAttribPointer在带有着色器的OpenGL 2.0中绘制模型

标签 ios opengl-es-2.0 vertex-shader vertex-array

我已经基于使用OpenGLES 2.0并且还使用Shaders的默认模板松散地打开了面向对象的iOS应用程序,但是我试图加载一个我以前称之为的模型:

#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)。现在,我不是100%,但是我读到某个地方不赞成使用glVertexPointer,而我正努力在演示应用程序中使其正常工作。目前,我正在绘制这个简单的多维数据集:

我从中获取OpenGL着色器代码的模板使用glVertexAttribPointer代替,并且使用的顶点数组略有不同,因为它在同一数组中包含法线:
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,
    ...
}

最佳答案

使用数组的结构。绘制多维数据集的代码示例正在使用交错的顶点数据。它也称为结构数组。这是一个recommended layout

要支持您的数据格式,只需为每个属性(sphere_modelVerts,sphere_modelNormals ...)创建单独的缓冲区并定义没有偏移量的属性。

关于ios - 使用glVertexAttribPointer在带有着色器的OpenGL 2.0中绘制模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149799/

相关文章:

ios - Airplay 与 AVQueuePlayer 有差距

android - Opengl开发依赖GPU吗?

ios - 在 iOS 上更改 OpenGL ES 版本

webgl - 调用 glDisableVertexAttribArray() 重要吗?

c++ - 为什么 Tessellation control shader 被多次调用?

ios - 通过代码访问麦克风进行录音,iOS

iphone - UIImagePickerController 浏览多个 View 并打开相机后相机取消不起作用?

ios - “???”显示在 iOS 设备上的字符串中,但不是模拟器

ios - glFramebufferTexture2D 使用 EAGLContext 返回无效状态的其他原因?