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
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/bloeys/go-sdl-engine/buffers"
|
||||||
"github.com/bloeys/go-sdl-engine/input"
|
"github.com/bloeys/go-sdl-engine/input"
|
||||||
"github.com/bloeys/go-sdl-engine/logging"
|
"github.com/bloeys/go-sdl-engine/logging"
|
||||||
"github.com/bloeys/go-sdl-engine/shaders"
|
"github.com/bloeys/go-sdl-engine/shaders"
|
||||||
@ -15,8 +16,9 @@ const (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
isRunning bool = true
|
isRunning bool = true
|
||||||
|
window *sdl.Window
|
||||||
|
|
||||||
window *sdl.Window
|
simpleShader shaders.ShaderProgram
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -41,6 +43,8 @@ func main() {
|
|||||||
initOpenGL()
|
initOpenGL()
|
||||||
loadShaders()
|
loadShaders()
|
||||||
|
|
||||||
|
buffers.HandleBuffers(simpleShader)
|
||||||
|
|
||||||
//Game loop
|
//Game loop
|
||||||
for isRunning {
|
for isRunning {
|
||||||
|
|
||||||
@ -69,13 +73,13 @@ func initOpenGL() {
|
|||||||
sdl.GLSetAttribute(sdl.GL_DOUBLEBUFFER, 1)
|
sdl.GLSetAttribute(sdl.GL_DOUBLEBUFFER, 1)
|
||||||
gl.ClearColor(0, 0, 0, 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() {
|
func loadShaders() {
|
||||||
|
|
||||||
simpleShader, err := shaders.NewShaderProgram()
|
var err error
|
||||||
|
simpleShader, err = shaders.NewShaderProgram()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logging.ErrLog.Fatalln("Failed to create new shader program. Err: ", err)
|
logging.ErrLog.Fatalln("Failed to create new shader program. Err: ", err)
|
||||||
}
|
}
|
||||||
@ -121,17 +125,9 @@ func draw() {
|
|||||||
|
|
||||||
gl.Clear(gl.COLOR_BUFFER_BIT)
|
gl.Clear(gl.COLOR_BUFFER_BIT)
|
||||||
|
|
||||||
gl.Begin(gl.TRIANGLES)
|
simpleShader.Use()
|
||||||
|
//DRAW
|
||||||
gl.Vertex3f(-0.5, 0.5, 0)
|
gl.DrawArrays(gl.TRIANGLES, 0, 6)
|
||||||
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()
|
|
||||||
|
|
||||||
window.GLSwap()
|
window.GLSwap()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#version 460
|
#version 460
|
||||||
|
|
||||||
out vec4 FragColor;
|
out vec4 fragColor;
|
||||||
|
|
||||||
void main()
|
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()
|
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)
|
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) {
|
func NewShaderProgram() (ShaderProgram, error) {
|
||||||
|
|
||||||
id := gl.CreateProgram()
|
id := gl.CreateProgram()
|
||||||
|
|||||||
Reference in New Issue
Block a user