Нарисуйте треугольник с помощью OpenGL ES для iOS - PullRequest
0 голосов
/ 04 июля 2019

Я не эксперт по OpenGL, и мне трудно нарисовать треугольник на экране.Я изменяю старый пример проекта от Apple (GLPaint), который я перенес в Swift.Проект представляет собой простое приложение для рисования пальцами, и я хотел бы изменить его так, чтобы я мог рисовать фигуры.

Я могу рисовать точки (GL_POINTS), но не треугольники (GL_TRIANGLES)

Я нашел похожий пост, где пользователь пытался сделать то же самое, что и я, но это не помогло:

Draw Square с OpenGL ES для 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), но на экране ничего не было нарисовано.Также не было сообщений об ошибках, напечатанных на консоли.

Любая помощь или направление будут с благодарностью.

...