Thanks Ray! Iāve followed the tutorial using Swift but stuck with the Creating Vertex Buffer Objects
and Updated Render Code
, here is my OpenGLView.swift code:
//
// OpenGLView.swift
// LearnOpenGLES
//
// Created by tomisacat on 08/06/2017.
// Copyright Ā© 2017 tomisacat. All rights reserved.
//
import Foundation
import OpenGLES
import GLKit
import QuartzCore
struct Vertex {
var Position:(Float, Float, Float)
var Color: (Float, Float, Float, Float)
}
var vertices = [
Vertex(Position: (1, -1, 0), Color: (1, 0, 0, 1)),
Vertex(Position: (1, 1, 0) , Color: (0, 1, 0, 1)),
Vertex(Position: (-1, 1, 0) , Color: (0, 0, 1, 1)),
Vertex(Position: (-1, -1, 0), Color: (0, 0, 0, 1))
]
var indices: [GLubyte] = [
0, 1, 2,
2, 3, 0
]
class OpenGLView: UIView {
fileprivate var eaglLayer: CAEAGLLayer!
fileprivate var context: EAGLContext!
fileprivate var colorRenderBuffer: GLuint = 0
fileprivate var positionSlot: GLuint = 0
fileprivate var colorSlot: GLuint = 0
override init(frame: CGRect) {
super.init(frame: frame)
callSetups()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
callSetups()
}
override class var layerClass: AnyClass {
return CAEAGLLayer.self
}
// MARK: private setup
private func compileShaders() {
let vertexShader: GLuint = compile(shader: "SimpleVertex", withType: GLenum(GL_VERTEX_SHADER))
let fragmentShader: GLuint = compile(shader: "SimpleFragment", withType: GLenum(GL_FRAGMENT_SHADER))
let programHandle: GLuint = glCreateProgram()
glAttachShader(programHandle, vertexShader)
glAttachShader(programHandle, fragmentShader)
glLinkProgram(programHandle)
var linkSuccess: GLint = GL_FALSE
glGetProgramiv(programHandle, GLenum(GL_LINK_STATUS), &linkSuccess)
if linkSuccess == GL_FALSE {
let messages: UnsafeMutablePointer<GLchar> = UnsafeMutablePointer.allocate(capacity: 256 * MemoryLayout<GLchar>.size)
var length: GLsizei = 0
glGetProgramInfoLog(programHandle, GLsizei(MemoryLayout.size(ofValue: messages)), &length, messages)
if let log = NSString(utf8String: messages) {
print(log)
}
}
glUseProgram(programHandle)
positionSlot = GLuint(glGetAttribLocation(programHandle, "Position"))
colorSlot = GLuint(glGetAttribLocation(programHandle, "SourceColor"))
glEnableVertexAttribArray(positionSlot)
glEnableVertexAttribArray(colorSlot)
}
private func compile(shader: String, withType type: GLenum) -> GLuint {
guard let shaderPath = Bundle.main.path(forResource: shader, ofType: "glsl") else {
return 0
}
do {
let shaderString = try String(contentsOfFile: shaderPath)
let shaderHandle = glCreateShader(type)
var shaderStringUTF8 = UnsafePointer(shaderString.cString(using: .utf8))
var shaderStringLength = GLint(shaderString.characters.count)
glShaderSource(shaderHandle, 1, &shaderStringUTF8, &shaderStringLength)
glCompileShader(shaderHandle)
var compileSuccess: GLint = GL_FALSE
glGetShaderiv(shaderHandle, GLenum(GL_COMPILE_STATUS), &compileSuccess)
if compileSuccess == GL_FALSE {
let messages: UnsafeMutablePointer<GLchar> = UnsafeMutablePointer.allocate(capacity: 256 * MemoryLayout<GLchar>.size)
var length: GLsizei = 0
glGetShaderInfoLog(shaderHandle, GLsizei(MemoryLayout.size(ofValue: messages)), &length, messages)
if let log = NSString(utf8String: messages) {
print(log)
}
return 0
}
return shaderHandle
} catch {
return 0
}
}
//
private func setupVBOs() {
var vertexBuffer: GLuint = 0
glGenBuffers(1, &vertexBuffer)
glBindBuffer(GLenum(GL_ARRAY_BUFFER), vertexBuffer)
glBufferData(GLenum(GL_ARRAY_BUFFER), MemoryLayout.size(ofValue: vertices), vertices, GLenum(GL_STATIC_DRAW))
var indexBuffer: GLuint = 0
glGenBuffers(1, &indexBuffer)
glBindBuffer(GLenum(GL_ELEMENT_ARRAY_BUFFER), indexBuffer)
glBufferData(GLenum(GL_ELEMENT_ARRAY_BUFFER), MemoryLayout.size(ofValue: indices), indices, GLenum(GL_STATIC_DRAW))
}
private func render() {
glClearColor(0, 104/255, 55/255, 1)
glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
glViewport(0, 0, GLsizei(frame.size.width), GLsizei(frame.size.height))
glVertexAttribPointer(positionSlot, 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<Vertex>.size), nil)
glVertexAttribPointer(colorSlot, 4, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<Vertex>.size), UnsafePointer<Float>(bitPattern: 3 * MemoryLayout<Float>.size))
glDrawElements(GLenum(GL_TRIANGLES), GLsizei(indices.count), GLenum(GL_UNSIGNED_BYTE), nil)
context.presentRenderbuffer(Int(GL_RENDERBUFFER))
}
// private func render() {
// glClearColor(0, 104/255, 55/255, 1)
// glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
// context.presentRenderbuffer(Int(GL_RENDERBUFFER))
// }
//
private func callSetups() {
setupLayer()
setupContext()
setupRenderBuffer()
setupFrameBuffer()
compileShaders()
setupVBOs()
render()
}
private func setupLayer() {
eaglLayer = self.layer as! CAEAGLLayer
eaglLayer.isOpaque = true
}
private func setupContext() {
context = EAGLContext(api: .openGLES3)
if context == nil {
context = EAGLContext(api: .openGLES2)
}
EAGLContext.setCurrent(context)
}
private func setupRenderBuffer() {
glGenRenderbuffers(1, &colorRenderBuffer)
glBindRenderbuffer(GLenum(GL_RENDERBUFFER), colorRenderBuffer)
context.renderbufferStorage(Int(GL_RENDERBUFFER), from: eaglLayer)
}
private func setupFrameBuffer() {
var frameBuffer: GLuint = 0
glGenFramebuffers(1, &frameBuffer)
glBindFramebuffer(GLenum(GL_FRAMEBUFFER), frameBuffer)
glFramebufferRenderbuffer(GLenum(GL_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_RENDERBUFFER), colorRenderBuffer)
}
}
What I hope is exactly like your tutorial, a gradient image show on screen, but I just got a green image like the previous step. Whatās wrong with my code?
If there is an update version for Swift will be awesome!