VBOs+attributes+drawing with VBOs

This commit is contained in:
bloeys
2021-10-23 21:47:54 +04:00
parent bb9a2885e2
commit 5e3123b00e
6 changed files with 98 additions and 53 deletions

35
buffers/buffers.go Executable file
View File

@ -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))
}

26
main.go
View File

@ -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
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()
}

View File

@ -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);
}

View File

@ -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)
}

49
shaders/shader_program.go Executable file
View File

@ -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)
}

View File

@ -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()