OpenGL ES三角形在iOS上绘制错误

时间:2015-01-30 16:24:07

标签: ios opengl-es glkit

我尝试使用OpenGL ES和iOS绘制多个三角形。我使用具有以下结构的浮点值创建顶点数组

  

{x,y,z,r,g,b,a}

表示每个顶点。一个三角形的最终数组是:

  

{x1,y1,z1,r1,g1,b1,a1,x2,y2,z2,r2,g2,b2,a2,x3,y3,z3,   r3,g3,b3,a3}

这是我的更新方法:

-(void)update {
    float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 1.0, 100.0);
    self.effect.transform.projectionMatrix = projectionMatrix;
}

并渲染:

-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    [self drawShapes]; // here I fill vertices array

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

    int numItems = 3 * trianglesCount;

    glBindVertexArrayOES(vao);

    [self.effect prepareToDraw];

    glUseProgram(shaderProgram);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * itemSize, convertedVerts, GL_DYNAMIC_DRAW);

    glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, stride, 0);
    glEnableVertexAttribArray(GLKVertexAttribPosition);

    glVertexAttribPointer(vertexColorAttribute, 4, GL_FLOAT, false, stride, (GLvoid*)(3 * sizeof(float)));
    glEnableVertexAttribArray(GLKVertexAttribColor);

    glDrawArrays(GL_TRIANGLES, 0, numItems);
}

上下文设置。在这里,我绑定我的顶点数组并生成顶点缓冲区:

-(void)setupContext
{
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if(!self.context) {
        NSLog(@"Failed to create OpenGL ES Context");
    }

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    [EAGLContext setCurrentContext:self.context];

    self.effect = [[GLKBaseEffect alloc] init];

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

    glGenVertexArraysOES(1, &vao);
    glBindVertexArrayOES(vao);

    glGenBuffers(1, &vbo);
}

片段和顶点着色器非常简单:

//fragment
varying lowp vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}

//vertex
attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
varying lowp vec4 vColor;

void main(void) {
    gl_Position = vec4(aVertexPosition, 1.0);
    vColor = aVertexColor;
}

结果。三角形未显示:

enter image description here

哪里出错?我猜问题是投影矩阵。这是Xcode项目的github link

1 个答案:

答案 0 :(得分:1)

下载您的代码并试用它。我看到紫色的屏幕,没有三角形,所以我猜这是问题所在。我发现可能存在两个问题:

1)您需要传递glBufferData您发送它的总字节数,如下所示:glBufferData(GL_ARRAY_BUFFER, sizeof(float) * itemSize * numItems, convertedVerts, GL_DYNAMIC_DRAW);。与如何分块数据相关的任何数据都保留glVertexAttribPointer。

2)这似乎不是唯一的事情,因为我仍然无法显示三角形。我之前从未使用过GLKit(我只是在桌面平台上有一点OpenGL经验)。话虽如此,如果我分别用0和1替换GLKVertexAttributePosition和GLKVertexAttribColor。并应用1中的glBufferData修复程序当我移动鼠标时,我看到模拟器屏幕上闪烁的工件。因此,那些枚举值和glVertexAttribPointer必须是可疑的。

编辑 - 澄清2:

按照1中的描述更改glBufferData行之后。我还修改了glEnableVertexAttribArray行,如下所示:

glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, stride, 0);
glEnableVertexAttribArray(0);

glVertexAttribPointer(vertexColorAttribute, 4, GL_FLOAT, false, stride, (GLvoid*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);

在这两个变化之后,我可以看到屏幕上闪烁的红色三角形。更进一步,因为我以前看不到任何东西。但我还没有能够解决这个问题:(