4

我可以使用着色器、glVertexAttribPointer 和 glDrawArrays 显示纹理,如下所示:

在里面

const GLfloat squareVertices[] = {
    -0.5f, -0.33f,
    0.5f, -0.33f,
    -0.5f,  0.33f,
    0.5f,  0.33f
};


const GLfloat squareTex[] = {
    0, 0,
    1, 0,
    0, 1,
    1, 1
};


glEnableVertexAttribArray(PositionTag);
glEnableVertexAttribArray(TexCoord0Tag);

glVertexAttribPointer(PositionTag, 2, GL_FLOAT, GL_FALSE, 0, squareVertices);
glVertexAttribPointer(TexCoord0Tag, 2, GL_FLOAT, GL_FALSE, 0, squareTex);

并为平局

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

但我很难转换为 VBO、着色器和 glDrawElements。这是我到目前为止的代码,但没有显示:

标题

typedef struct MyVertex
{
    float x, y, z;        //Vertex
    float nx, ny, nz;     //Normal
    float s0, t0;         //Texcoord0
} MyVertex;

#define BUFFER_OFFSET(i) ((char *)NULL + (i))

在里面

glGenBuffers(1, &VertexVBOID);

glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);

MyVertex pvertices[4];
//Fill the pvertices array
pvertices[0].x = -0.5f;
pvertices[0].y = -0.33f;
pvertices[0].z = 0.0;
pvertices[0].nx = 0.0;
pvertices[0].ny = 0.0;
pvertices[0].nz = 1.0;
pvertices[0].s0 = 0.0;
pvertices[0].t0 = 0.0;

pvertices[1].x = 0.5f;
pvertices[1].y = -0.33f;
pvertices[1].z = 0.0;
pvertices[1].nx = 0.0;
pvertices[1].ny = 0.0;
pvertices[1].nz = 1.0;
pvertices[1].s0 = 1.0;
pvertices[1].t0 = 0.0;

pvertices[2].x = -0.5f;
pvertices[2].y = 0.33f;
pvertices[2].z = 0.0;
pvertices[2].nx = 0.0;
pvertices[2].ny = 0.0;
pvertices[2].nz = 1.0;
pvertices[2].s0 = 0.0;
pvertices[2].t0 = 1.0;

pvertices[3].x = 0.5f;
pvertices[3].y = 0.33f;
pvertices[3].z = 0.0;
pvertices[3].nx = 0.0;
pvertices[3].ny = 0.0;
pvertices[3].nz = 1.0;
pvertices[3].s0 = 1.0;
pvertices[3].t0 = 1.0;

glBufferData(GL_ARRAY_BUFFER, sizeof(MyVertex)*4, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(MyVertex)*4, pvertices);


glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);

int pindices[6];
pindices[0]=0;
pindices[1]=1;
pindices[2]=2;
pindices[3]=2;
pindices[4]=1;
pindices[5]=3;
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*6, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int)*6, pindices);

glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);

glEnableVertexAttribArray(PositionTag);
glEnableVertexAttribArray(NormalTag);
glEnableVertexAttribArray(TexCoord0Tag);

glVertexAttribPointer(PositionTag, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(0));
glVertexAttribPointer(NormalTag, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(12));
glVertexAttribPointer(TexCoord0Tag, 2, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(24));

//    glDrawRangeElements(GL_TRIANGLES, x, y, z, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glDrawElements(GL_TRIANGLES, 3, GL_INT, 0);
4

2 回答 2

4

根据这里GL_INT不是用于索引的有效类型glDrawElements。尝试将unsigned ints 用于您的索引(当然还有GL_UNSIGNED_INTin glDrawElements)。您仍然可以将int数据用作索引,但根据glDrawElements需要GL_UNSIGNED_INT,制作数组会更加一致unsigned int

编辑:查看规范后(基于您的标签,我采用了 ES 2.0 规范),他们似乎进一步将其限制为无符号字节和无符号短。我不知道它在 iOS 中是否受到限制,但我们可以得出结论,数据至少必须是未签名的。另一方面,我没有找到任何关于GL_INVALID_ENUM在错误类型参数上引发的可能错误的声明,但得到一个是合理的。

于 2011-08-03T11:37:36.933 回答
1

您的代码看起来并没有大错特错,所以这次魔鬼在细节的某个地方。我的猜测是,您使用的结构及其数据字段的对齐方式与传递给 OpenGL 的偏移量不匹配。

我建议您使用stddef.hoffsetof()中的宏来便携地获取数据字段的偏移量。

于 2011-08-03T07:18:58.143 回答