Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone OpenGL ES 1.1:无法转换为VBO_Iphone_Opengl Es_Vbo - Fatal编程技术网

Iphone OpenGL ES 1.1:无法转换为VBO

Iphone OpenGL ES 1.1:无法转换为VBO,iphone,opengl-es,vbo,Iphone,Opengl Es,Vbo,我尝试将顶点数据转换为VBO,但总是出现黑屏…我不知道我的实现出了什么问题。在渲染中,如果删除bindBuffer调用,并将顶点指针传递给glVertexPointer(而不是0),则会正常工作,从而正确填充NBVertex和顶点 Vec3定义: struct vec3 { float x; float y; float z; } 创建: glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER,

我尝试将顶点数据转换为VBO,但总是出现黑屏…我不知道我的实现出了什么问题。在渲染中,如果删除bindBuffer调用,并将顶点指针传递给glVertexPointer(而不是0),则会正常工作,从而正确填充NBVertex和顶点

Vec3定义:

struct vec3
{
    float x;
    float y;
    float z;
}
创建:

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * this->nbVertices, vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);
渲染:

glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// draw cube
glScalef(scaleX, scaleY, scaleZ);

glRotatef(rotX, 1, 0, 0);
glRotatef(rotY, 0, 1, 0);
glRotatef(rotZ, 0, 0, 1);

for (int i=0; i<nbTextures; i++)
{
    glBindTexture(GL_TEXTURE_2D, textureIds[i]);

    glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, 0/*this->vertices*/);

    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, 0, this->normals);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, this->texCoords);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, this->nbVertices);
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,0);
glClear(GL\u颜色\u缓冲\u位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
//绘制立方体
glScalef(scaleX、scaleY、scaleZ);
glRotatef(rotX,1,0,0);
glRotatef(rotY,0,1,0);
glRotatef(rotZ,0,0,1);
对于(int i=0;河流*/);
glEnableClientState(GL_普通_阵列);
glNormalPointer(GL_FLOAT,0,this->normals);
glEnableClientState(GL_纹理_坐标_阵列);
glTexCoordPointer(2,GL_FLOAT,0,this->texCoords);
gldrawArray(GL\u三角形\u条,0,此->n顶点);
}
glDisableClientState(GL_顶点_数组);
glDisableClientState(GL_NORMAL_数组);
glDisableClientState(GL_纹理_坐标_数组);
glBindBuffer(GL_数组_BUFFER,0);

问题在于您将VBO与客户端阵列混合使用。虽然这没有问题,但在绑定VBO时,不能指定指向客户端数组的指针(就像对顶点数组以外的所有其他数组所做的那样)。指针将被视为缓冲区中的偏移量

因此,在调用
glvertexpinter
后,或者解除缓冲区绑定:

glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0/*this->vertices*/);
glBindBuffer(GL_ARRAY_BUFFER,0);

glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, this->normals);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, this->texCoords);

或者,最好不要混合使用VBOs和客户端数组,并对每个属性使用VBOs。您可以对每个属性使用相同的VBO,或者一个接一个地放置各个数组(在这种情况下,您必须稍微处理偏移),或者一个接一个地放置每个顶点的属性数据(通常是最佳方法),这样您也必须处理步幅参数。但是您也可以对每个属性使用不同的VBO,但是在这种情况下,请记住在每次调用
gl…Pointer
之前绑定正确的VBO,如上所述。

Ah!Thx的提示,它的工作就像一个魅力!我实际上只对顶点使用vbo,所以我可以测试它的工作原理,我实际上想转换所有内容…我将尝试使用交错顶点数据