mirror of
https://github.com/bloeys/nmage.git
synced 2025-12-29 13:28:20 +00:00
VBOs+attributes+drawing with VBOs
This commit is contained in:
35
buffers/buffers.go
Executable file
35
buffers/buffers.go
Executable 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
26
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
|
||||
|
||||
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()
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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
49
shaders/shader_program.go
Executable 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)
|
||||
}
|
||||
@ -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()
|
||||
|
||||
Reference in New Issue
Block a user