Я не эксперт по 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), но на экране ничего не было нарисовано.Также не было сообщений об ошибках, напечатанных на консоли.
Любая помощь или направление будут с благодарностью.