Drawing triangles using fixed function pipelines

This commit is contained in:
bloeys
2021-10-23 20:58:10 +04:00
parent b296f1af4c
commit bb9a2885e2
4 changed files with 128 additions and 41 deletions

10
shaders/shader_types.go Executable file
View File

@ -0,0 +1,10 @@
package shaders
import "github.com/go-gl/gl/v4.6-compatibility/gl"
type ShaderType int
const (
VertexShaderType ShaderType = gl.VERTEX_SHADER
FragmentShaderType ShaderType = gl.FRAGMENT_SHADER
)

View File

@ -1,6 +1,7 @@
package shaders
import (
"errors"
"os"
"strings"
@ -8,58 +9,94 @@ import (
"github.com/go-gl/gl/v4.6-compatibility/gl"
)
type Shader struct {
ID uint32
ShaderType ShaderType
}
func (s Shader) Delete() {
gl.DeleteShader(s.ID)
}
type ShaderProgram struct {
ID uint32
VertShaderID uint32
FragShaderID uint32
}
func LoadShaders() {
func (sp *ShaderProgram) AttachShader(shader Shader) {
vertShaderText, err := os.ReadFile("./res/shaders/simple.vert.glsl")
if err != nil {
logging.ErrLog.Fatalln("Failed to read vertex shader. Err: ", err)
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)
}
fragShaderText, err := os.ReadFile("./res/shaders/simple.frag.glsl")
if err != nil {
logging.ErrLog.Fatalln("Failed to read fragment shader. Err: ", err)
}
shader := &ShaderProgram{}
shader.ID = gl.CreateProgram()
if shader.ID == 0 {
logging.ErrLog.Fatalln("Failed to create shader program")
}
shader.VertShaderID = gl.CreateShader(gl.VERTEX_SHADER)
shader.FragShaderID = gl.CreateShader(gl.FRAGMENT_SHADER)
vertexCStr, vertFree := gl.Strs(string(vertShaderText) + "\x00")
defer vertFree()
gl.ShaderSource(shader.VertShaderID, 1, vertexCStr, nil)
fragCStr, fragFree := gl.Strs(string(fragShaderText) + "\x00")
defer fragFree()
gl.ShaderSource(shader.FragShaderID, 1, fragCStr, nil)
gl.CompileShader(shader.VertShaderID)
getShaderCompileErrors(shader.VertShaderID)
gl.CompileShader(shader.FragShaderID)
getShaderCompileErrors(shader.FragShaderID)
gl.AttachShader(shader.ID, shader.VertShaderID)
gl.AttachShader(shader.ID, shader.FragShaderID)
gl.LinkProgram(shader.ID)
}
func getShaderCompileErrors(shaderID uint32) {
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()
if id == 0 {
return ShaderProgram{}, errors.New("failed to create shader program")
}
return ShaderProgram{ID: id}, nil
}
func LoadAndCompilerShader(shaderPath string, shaderType ShaderType) (Shader, error) {
shaderSource, err := os.ReadFile(shaderPath)
if err != nil {
logging.ErrLog.Println("Failed to read shader. Err: ", err)
return Shader{}, err
}
shaderID := gl.CreateShader(uint32(shaderType))
if shaderID == 0 {
logging.ErrLog.Println("Failed to create shader.")
return Shader{}, errors.New("failed to create shader")
}
//Load shader source and compile
shaderCStr, shaderFree := gl.Strs(string(shaderSource) + "\x00")
defer shaderFree()
gl.ShaderSource(shaderID, 1, shaderCStr, nil)
gl.CompileShader(shaderID)
if err := getShaderCompileErrors(shaderID); err != nil {
gl.DeleteShader(shaderID)
return Shader{}, err
}
return Shader{ID: shaderID, ShaderType: shaderType}, nil
}
func getShaderCompileErrors(shaderID uint32) error {
var compiledSuccessfully int32
gl.GetShaderiv(shaderID, gl.COMPILE_STATUS, &compiledSuccessfully)
if compiledSuccessfully == gl.TRUE {
return
return nil
}
var logLength int32
@ -69,5 +106,6 @@ func getShaderCompileErrors(shaderID uint32) {
gl.GetShaderInfoLog(shaderID, logLength, nil, log)
errMsg := gl.GoStr(log)
println("Compilation of shader with id ", shaderID, " failed. Err: ", errMsg)
logging.ErrLog.Println("Compilation of shader with id ", shaderID, " failed. Err: ", errMsg)
return errors.New(errMsg)
}