Opengl es GLKit,纹理渲染中的崩溃

Opengl es GLKit,纹理渲染中的崩溃,opengl-es,opengl-es-2.0,glkit,Opengl Es,Opengl Es 2.0,Glkit,我正在使用GLKit在OpenGLES2.0中创建一个矩形。这是工作,我可以用纯色和渐变填充矩形 现在,我正试图用一幅图像的纹理填充它,这对我来说是行不通的 我在GLDraweElements行上收到一个EXC\u BAD\u访问代码=1错误。 以下是我现在拥有的: //设置GKLView EAGLContext*context=[[EAGLContext alloc]initWithAPI:keagrenderingapiopengles2]; self.glkView=[[glkView a

我正在使用GLKit在OpenGLES2.0中创建一个矩形。这是工作,我可以用纯色和渐变填充矩形

现在,我正试图用一幅图像的纹理填充它,这对我来说是行不通的

我在GLDraweElements行上收到一个EXC\u BAD\u访问代码=1错误。

以下是我现在拥有的:

//设置GKLView

EAGLContext*context=[[EAGLContext alloc]initWithAPI:keagrenderingapiopengles2];
self.glkView=[[glkView alloc]initWithFrame:self.bounds
上下文:上下文];
_glkView.不透明=否;
_glkView.backgroundColor=[UIColor clearColor];
_glkView.delegate=self;
[自添加子视图:_glkView];

//设置基效应

self.effect=[[glkbaseffect alloc]init];
[EAGLContext setCurrentContext:_glkView.context];
GLKMatrix4 projectionMatrix=GLKMatrix4MakeOrtho(0,self.bounds.size.width,0,self.bounds.size.height,0.0,1.0);
self.effect.transform.projectionMatrix=projectionMatrix;
GLKMatrix4 modelMatrix=GLKMatrix4Translate(GLKMatrix4Identity,0.0,0.0,-0.1);
self.effect.transform.modelviewMatrix=modelMatrix

//加载图像

UIImage*image=。。。
CGImageRef cgImage=image.cgImage;
n错误*错误;
self.textureInfo=[GLKTextureLoader textureWithCGImage:cgImage选项:无错误:&错误];
如果(错误){
NSLog(@“无法加载纹理”);
}
如果(_textureInfo){
self.effect.texture2d0.envMode=GLKTextureEnvModeReplace;
self.effect.texture2d0.target=GLKTextureTarget2D;
self.effect.texture2d0.name=\u textureInfo.name;
}
//绑定缓冲区

glGenBuffers(1,&u vertexBuffer);
glBindBuffer(GL_数组_BUFFER,_vertexBuffer);
glGenBuffers(1,&u indexBuffer);
glBindBuffer(GL_元素_数组_BUFFER,_indexBuffer);
GlenableVertexAttributeArray(GLkVertexAttributePosition);
glvertexattributepointer(glkVertexattributePosition,2,GL_FLOAT,GL_FALSE,sizeof(顶点),(const GLvoid*)offsetof(顶点,位置));
GlenableVertexAttributeArray(GlkVertexAttributeCoord0);
glVertexAttributePointer(glkVertexAttributeCoord0,2,GL_FLOAT,GL_FALSE,0,_currentData.tex坐标);

//填充缓冲区

glBufferData(GL\u数组\u BUFFER,(sizeof(顶点)*\u currentData.numberoftexts),\u currentData.vertexts,GL\u STATIC\u DRAW);
glBufferData(GL\u元素\u数组\u缓冲区,(sizeof(GLubyte)*\u currentData.numberofindex),\u currentData.index,GL\u静态\u绘图);

[self.effect prepareToDraw];
[self.glkView显示]

//内部-(void)glkView:(glkView*)视图drawInRect:(CGRect)rect;
gld元素(glu三角形条带,(sizeof(GLubyte)*\u currentData.numberofindex),glu无符号字节,0)

纹理坐标的数据为:

    SimpleVertex* vertices1 = (SimpleVertex *)malloc(sizeof(SimpleVertex) * 4);
    vertices1[0].Position[0] = 0.0;
    vertices1[0].Position[1] = 0.0;

    vertices1[1].Position[0] = 0.0;
    vertices1[1].Position[1] = 1.0;

    vertices1[2].Position[0] = 1.0;
    vertices1[2].Position[1] = 1.0;

    vertices1[3].Position[0] = 1.0;
    vertices1[3].Position[1] = 0.0;

typedef struct
{
    GLfloat Position[2];
}
SimpleVertex;
正如我所说,我确信矩形的绘制是正确的。我可以用梯度填充来检查,看起来不错。另外,纹理加载程序正在正确加载图像,我可以在调试器中检查这一点


有人能指出我遗漏了什么或做错了什么吗?

好的,我知道了。错误在于我将纹理坐标数据传递给openGL的方式。我通过以下方式传递顶点和颜色的数据:

glEnableVertexAttribArray(GLKVertexAttribPosition);
glvertexattributepointer(glkVertexattributePosition,2,GL_FLOAT,GL_FALSE,sizeof(顶点),(const GLvoid*)offsetof(顶点,位置))

但对于纹理坐标,我创建了一个单独的结构,并传递指向该数据的指针,而不是指向已绑定顶点数组的偏移:

glVertexAttributePointer(glkVertexAttributeCoord0,2,GL_FLOAT,GL_FALSE,0,_currentData.tex坐标)

很明显,解决方案是将数据包含在顶点数据结构中,然后给出偏移量,如下所示:

glVertexAttributePointer(glkVertexAttributeCoord0,2,GL_FLOAT,GL_FALSE,sizeof(顶点),(const GLvoid*)offsetof(顶点,TexCoord))

我还是OpenGL ES的新手,所以可能有更好的方法来解决这个问题,但这对我来说很有效