ios opengl es 2.0 2D + 3D组合

时间:2012-04-21 02:59:27

标签: ios opengl-es opengl-es-2.0

我正在尝试在OpenGL ES“2.0”中结合2D和3D,尽管这里有很多关于openGL es 1.0的问题和一些关于2.0的问题,但是我很难解决这个问题。所以对于2D我将离开本教程:http://www.raywenderlich.com/9743/how-to-create-a-simple-2d-iphone-game-with-opengl-es-2-0-and-glkit-part-1而对于3D我正在使用现有的立方体旋转xcode模板......

我在第二个glDrawArray上得到了EXC_BAD_ACCESS(不知何故,它认为原始缓冲区仍然适用?无论如何在绘制2D纹理之前将其解除绑定?),并使用以下渲染函数。如果我禁用行,它可以工作:     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));

发生了什么事?提前谢谢。

[代码]

glEnable(GL_DEPTH_TEST);

// glGenVertexArraysOES(1, &_vertexArrayNum);
// glBindVertexArrayOES(_vertexArrayNum);

glGenBuffers(1, &_vertexBufferNum);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferNum);
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));

glBindVertexArrayOES(0);

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);

self.effect.transform.projectionMatrix = projectionMatrix;

GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f);
// baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f);

// Compute the model view matrix for the object rendered with GLKit
// GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f);
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeRotation(_rotation, 0, 1, 0);
//modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);
modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

self.effect.transform.modelviewMatrix = modelViewMatrix;

glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBindVertexArrayOES(_vertexArrayNum);

// Render the object with GLKit
// [self.effect prepareToDraw];

// glDrawArrays(GL_TRIANGLES, 0, 36);

modelViewMatrix = GLKMatrix4MakeScale(2.0f, 2.0f, 2.0f);
projectionMatrix = GLKMatrix4MakeOrtho(0, 480, 0, 320, -1024, 1048);
self.effect.transform.projectionMatrix = projectionMatrix;
self.effect.transform.modelviewMatrix = modelViewMatrix;

[self.effect prepareToDraw];


glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

[self.player render];

[/代码]

更新: 添加了glEnableClientState(GL_VERTEX_ARRAY);缠绕在立方体绘图部分...它摆脱了错误的访问错误,但是没有绘制立方体和精灵(除非我完全注释掉代码部分)...

UPDATE2: 所以问题显然是在我调用glDrawArray绘制立方体之后(工作正常)...我再次调用glDrawArray,如下所示。但不知何故,它仍然试图渲染以前的数组?     // 1     self.effect.texture2d0.name = self.textureInfo.name;     self.effect.texture2d0.enabled = YES;

// 2    
[self.effect prepareToDraw];

// 3
glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);

// 4
long offset = (long)&_quad;        
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex)));
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex)));

// 5    
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

1 个答案:

答案 0 :(得分:0)

愚蠢的我。我尽快工作:

glBindBuffer(GL_ARRAY_BUFFER, 0);

清除缓冲区。我一直在寻找glUnbind的东西......忘记了openGL在内存引用方面的工作...... 2D texutre现在应用于多维数据集,但我确信这是一个简单的修复:)....你们所有的帮助&gt ;:○

纹理问题已修复:)