From 5e3123b00ef9a13ca4e1a4edb2a126e746f6ce7c Mon Sep 17 00:00:00 2001 From: bloeys Date: Sat, 23 Oct 2021 21:47:54 +0400 Subject: [PATCH] VBOs+attributes+drawing with VBOs --- buffers/buffers.go | 35 ++++++++++++++++++++++++++ main.go | 26 ++++++++----------- res/shaders/simple.frag.glsl | 4 +-- res/shaders/simple.vert.glsl | 2 +- shaders/shader_program.go | 49 ++++++++++++++++++++++++++++++++++++ shaders/shaders.go | 35 -------------------------- 6 files changed, 98 insertions(+), 53 deletions(-) create mode 100755 buffers/buffers.go create mode 100755 shaders/shader_program.go diff --git a/buffers/buffers.go b/buffers/buffers.go new file mode 100755 index 0000000..c7c1122 --- /dev/null +++ b/buffers/buffers.go @@ -0,0 +1,35 @@ +package buffers + +import ( + "github.com/bloeys/go-sdl-engine/logging" + "github.com/bloeys/go-sdl-engine/shaders" + "github.com/go-gl/gl/v4.6-compatibility/gl" +) + +func HandleBuffers(sp shaders.ShaderProgram) { + + //Create and fill Vertex buffer object + var vboID uint32 + gl.CreateBuffers(1, &vboID) + if vboID == 0 { + logging.ErrLog.Println("Failed to create openGL buffer") + } + + gl.BindBuffer(gl.ARRAY_BUFFER, vboID) + + vertices := []float32{ + -0.5, 0.5, 0, + 0.5, 0.5, 0, + -0.5, -0.5, 0, + + 0.5, 0.5, 0, + 0.5, -0.5, 0, + -0.5, -0.5, 0, + } + gl.BufferData(gl.ARRAY_BUFFER, 4*len(vertices), gl.Ptr(vertices), gl.STATIC_DRAW) + + //Assign the VBO to vertPos attribute + vertPosLoc := sp.GetAttribLoc("vertPos") + gl.VertexAttribPointer(uint32(vertPosLoc), 3, gl.FLOAT, false, 3*4, gl.PtrOffset(0)) + gl.EnableVertexAttribArray(uint32(vertPosLoc)) +} diff --git a/main.go b/main.go index 87dba0b..46abcc7 100755 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "github.com/bloeys/go-sdl-engine/buffers" "github.com/bloeys/go-sdl-engine/input" "github.com/bloeys/go-sdl-engine/logging" "github.com/bloeys/go-sdl-engine/shaders" @@ -15,8 +16,9 @@ const ( var ( isRunning bool = true + window *sdl.Window - window *sdl.Window + simpleShader shaders.ShaderProgram ) func main() { @@ -41,6 +43,8 @@ func main() { initOpenGL() loadShaders() + buffers.HandleBuffers(simpleShader) + //Game loop for isRunning { @@ -69,13 +73,13 @@ func initOpenGL() { sdl.GLSetAttribute(sdl.GL_DOUBLEBUFFER, 1) gl.ClearColor(0, 0, 0, 1) - sdl.GLSetAttribute(sdl.GL_CONTEXT_PROFILE_MASK, sdl.GL_CONTEXT_PROFILE_COMPATIBILITY) - // sdl.GLSetAttribute(sdl.GL_CONTEXT_PROFILE_MASK, sdl.GL_CONTEXT_PROFILE_CORE) + sdl.GLSetAttribute(sdl.GL_CONTEXT_PROFILE_MASK, sdl.GL_CONTEXT_PROFILE_CORE) } func loadShaders() { - simpleShader, err := shaders.NewShaderProgram() + var err error + simpleShader, err = shaders.NewShaderProgram() if err != nil { logging.ErrLog.Fatalln("Failed to create new shader program. Err: ", err) } @@ -121,17 +125,9 @@ func draw() { gl.Clear(gl.COLOR_BUFFER_BIT) - gl.Begin(gl.TRIANGLES) - - gl.Vertex3f(-0.5, 0.5, 0) - gl.Vertex3f(0.5, 0.5, 0) - gl.Vertex3f(-0.5, -0.5, 0) - - gl.Vertex3f(0.5, 0.5, 0) - gl.Vertex3f(0.5, -0.5, 0) - gl.Vertex3f(-0.5, -0.5, 0) - - gl.End() + simpleShader.Use() + //DRAW + gl.DrawArrays(gl.TRIANGLES, 0, 6) window.GLSwap() } diff --git a/res/shaders/simple.frag.glsl b/res/shaders/simple.frag.glsl index 32fb60e..d88aa26 100755 --- a/res/shaders/simple.frag.glsl +++ b/res/shaders/simple.frag.glsl @@ -1,8 +1,8 @@ #version 460 -out vec4 FragColor; +out vec4 fragColor; void main() { - FragColor = vec4(1, 0, 0, 1.0); + fragColor = vec4(1, 1, 1, 1.0); } diff --git a/res/shaders/simple.vert.glsl b/res/shaders/simple.vert.glsl index fc8198d..9cdcfd3 100755 --- a/res/shaders/simple.vert.glsl +++ b/res/shaders/simple.vert.glsl @@ -4,5 +4,5 @@ in vec3 vertPos; void main() { - gl_Position = vec4(vertPos, 1.0); + gl_Position = vec4(vertPos, 1.0); // vec4(vertPos.x, vertPos.y, vertPos.z, 1.0) } \ No newline at end of file diff --git a/shaders/shader_program.go b/shaders/shader_program.go new file mode 100755 index 0000000..033d57f --- /dev/null +++ b/shaders/shader_program.go @@ -0,0 +1,49 @@ +package shaders + +import ( + "github.com/bloeys/go-sdl-engine/logging" + "github.com/go-gl/gl/v4.6-compatibility/gl" +) + +type ShaderProgram struct { + ID uint32 + VertShaderID uint32 + FragShaderID uint32 +} + +func (sp *ShaderProgram) AttachShader(shader Shader) { + + gl.AttachShader(sp.ID, shader.ID) + switch shader.ShaderType { + case VertexShaderType: + sp.VertShaderID = shader.ID + case FragmentShaderType: + sp.FragShaderID = shader.ID + default: + logging.ErrLog.Println("Unknown shader type ", shader.ShaderType, " for ID ", shader.ID) + } +} + +func (sp *ShaderProgram) Link() { + + gl.LinkProgram(sp.ID) + + if sp.VertShaderID != 0 { + gl.DeleteShader(sp.VertShaderID) + } + if sp.FragShaderID != 0 { + gl.DeleteShader(sp.FragShaderID) + } +} + +func (sp *ShaderProgram) GetAttribLoc(attribName string) int32 { + return gl.GetAttribLocation(sp.ID, gl.Str(attribName+"\x00")) +} + +func (sp *ShaderProgram) Use() { + gl.UseProgram(sp.ID) +} + +func (sp *ShaderProgram) Delete() { + gl.DeleteProgram(sp.ID) +} diff --git a/shaders/shaders.go b/shaders/shaders.go index aa8a92e..a78406b 100755 --- a/shaders/shaders.go +++ b/shaders/shaders.go @@ -18,41 +18,6 @@ func (s Shader) Delete() { gl.DeleteShader(s.ID) } -type ShaderProgram struct { - ID uint32 - VertShaderID uint32 - FragShaderID uint32 -} - -func (sp *ShaderProgram) AttachShader(shader Shader) { - - gl.AttachShader(sp.ID, shader.ID) - switch shader.ShaderType { - case VertexShaderType: - sp.VertShaderID = shader.ID - case FragmentShaderType: - sp.FragShaderID = shader.ID - default: - logging.ErrLog.Println("Unknown shader type ", shader.ShaderType, " for ID ", shader.ID) - } -} - -func (sp *ShaderProgram) Link() { - - gl.LinkProgram(sp.ID) - - if sp.VertShaderID != 0 { - gl.DeleteShader(sp.VertShaderID) - } - if sp.FragShaderID != 0 { - gl.DeleteShader(sp.FragShaderID) - } -} - -func (sp *ShaderProgram) Delete() { - gl.DeleteProgram(sp.ID) -} - func NewShaderProgram() (ShaderProgram, error) { id := gl.CreateProgram()