使用适用于iOS的OpenGL ES绘制三角形

时间:2019-07-04 02:43:12

标签: ios swift opengl-es

我不是OpenGL专家,在屏幕上绘制三角形时遇到困难。我正在修改我已移植到Swift的Apple(GLPaint)的旧示例项目。该项目是一个基本的手指绘制应用程序,我想对其进行修改以便可以绘制形状。

我能够绘制点(GL_POINTS),但不能绘制三角形(GL_TRIANGLES)

我发现了一个类似的帖子,用户试图与我做同样的事情,但没有帮助:

Draw Square with OpenGL ES for iOS

下面是我用来成功在屏幕上绘制点的代码:

        EAGLContext.setCurrent(context)
        glBindFramebuffer(GL_FRAMEBUFFER.ui, viewFramebuffer)

        let squareVertices : [GLfloat] = [
            500.0, 500.0,
            1000.0,  500.0,
            1000.0,  1000.0,
        ]

        glDisable(GL_TEXTURE_2D.ui);
        glColor4f(1.0, 0.0, 0.0, 1.0);

        glEnableVertexAttribArray(ATTRIB_VERTEX.ui)
        glVertexAttribPointer(ATTRIB_VERTEX.ui, 2, GL_FLOAT.ui, GL_FALSE.ub, 0, squareVertices)

        glUseProgram(program[PROGRAM_POINT].id)
        glDrawArrays(GL_POINTS.ui, 0, 3)

        glBindRenderbuffer(GL_RENDERBUFFER.ui, viewRenderbuffer)
        context.presentRenderbuffer(GL_RENDERBUFFER.l)

下面是初始化代码:

    private func initGL() -> Bool {
        // Generate IDs for a framebuffer object and a color renderbuffer
        glGenFramebuffers(1, &viewFramebuffer)
        glGenRenderbuffers(1, &viewRenderbuffer)

        glBindFramebuffer(GL_FRAMEBUFFER.ui, viewFramebuffer)
        glBindRenderbuffer(GL_RENDERBUFFER.ui, viewRenderbuffer)
        // This call associates the storage for the current render buffer with the EAGLDrawable (our CAEAGLLayer)
        // allowing us to draw into a buffer that will later be rendered to screen wherever the layer is (which corresponds with our view).
        context.renderbufferStorage(GL_RENDERBUFFER.l, from: (self.layer as! EAGLDrawable))
        glFramebufferRenderbuffer(GL_FRAMEBUFFER.ui, GL_COLOR_ATTACHMENT0.ui, GL_RENDERBUFFER.ui, viewRenderbuffer)

        glGetRenderbufferParameteriv(GL_RENDERBUFFER.ui, GL_RENDERBUFFER_WIDTH.ui, &backingWidth)
        glGetRenderbufferParameteriv(GL_RENDERBUFFER.ui, GL_RENDERBUFFER_HEIGHT.ui, &backingHeight)

        // For this sample, we do not need a depth buffer. If you do, this is how you can create one and attach it to the framebuffer:
        //    glGenRenderbuffers(1, &depthRenderbuffer);
        //    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
        //    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
        //    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

        if glCheckFramebufferStatus(GL_FRAMEBUFFER.ui) != GL_FRAMEBUFFER_COMPLETE.ui {
            NSLog("failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER.ui))
            return false
        }

        // Setup the view port in Pixels
        glViewport(0, 0, backingWidth, backingHeight)

        // Create a Vertex Buffer Object to hold our data
        glGenBuffers(1, &vboId)

        // Load the brush texture
        brushTexture = self.texture(fromName: "ParticleNew.png")

        // Load shaders
        self.setupShaders()

        // Enable blending and set a blending function appropriate for premultiplied alpha pixel data
        glEnable(GL_BLEND.ui)
        glBlendFunc(GL_ONE.ui, GL_ONE_MINUS_SRC_ALPHA.ui)

        return true
    }

要绘制三角形,我尝试将glDrawArrays(GL_POINTS.ui,0,3)更改为glDrawArrays(GL_TRIANGLES.ui,0,3),但屏幕上未绘制任何内容。也没有错误消息打印到控制台。

任何帮助或指导将不胜感激。

0 个答案:

没有答案
相关问题