shader uniforms

This commit is contained in:
faiface 2016-11-30 17:41:48 +01:00
parent 96f134d4c4
commit d53eefbf59
2 changed files with 32 additions and 6 deletions

View File

@ -7,18 +7,29 @@ import (
"github.com/pkg/errors"
)
// UniformFormat defines names, purposes and types of uniform variables inside a shader.
//
// Example:
//
// UniformFormat{"transform": {Transform, Mat3}, "camera": {Camera, Mat3}}
type UniformFormat map[string]Attr
// Shader is an OpenGL shader program.
type Shader struct {
parent Doer
program uint32
parent Doer
format UniformFormat
program uint32
uniforms map[Attr]int32
}
// NewShader creates a new shader program from the specified vertex shader and fragment shader sources.
//
// Note that vertexShader and fragmentShader parameters must contain the source code, they're not filenames.
func NewShader(parent Doer, vertexShader, fragmentShader string) (*Shader, error) {
func NewShader(parent Doer, format UniformFormat, vertexShader, fragmentShader string) (*Shader, error) {
shader := &Shader{
parent: parent,
parent: parent,
format: format,
uniforms: make(map[Attr]int32),
}
var err, glerr error
@ -87,6 +98,15 @@ func NewShader(parent Doer, vertexShader, fragmentShader string) (*Shader, error
gl.DeleteShader(vshader)
gl.DeleteShader(fshader)
// uniforms
for uname, utype := range format {
ulocation := gl.GetUniformLocation(shader.program, gl.Str(uname+"\x00"))
if ulocation == -1 {
return fmt.Errorf("shader does not contain uniform '%s'", uname)
}
shader.uniforms[utype] = ulocation
}
return nil
})
})

View File

@ -12,6 +12,8 @@ import (
// Example:
//
// VertexFormat{{Position, Vec2}, {Color, Vec4}, {TexCoord, Vec2}, {Visible, Bool}}
//
// Note: vertex array currently doesn't support matrices in vertex format.
type VertexFormat []Attr
// Size calculates the total size of a single vertex in this vertex format (sum of the sizes of all vertex attributes).
@ -226,12 +228,15 @@ func (va *VertexArray) SetVertex(vertex int, data unsafe.Pointer) {
// SetVertexAttribute sets the value of the specified vertex attribute of the specified vertex.
// Argument data must point to a slice/array containing the new attribute data.
func (va *VertexArray) SetVertexAttribute(vertex int, attr Attr, data unsafe.Pointer) {
//
// This function returns false if the specified attribute does not exist. Note that the function panics
// if the vertex is out of range.
func (va *VertexArray) SetVertexAttribute(vertex int, attr Attr, data unsafe.Pointer) (ok bool) {
if vertex < 0 || vertex >= va.count {
panic("set vertex attribute error: invalid vertex index")
}
if _, ok := va.attrs[attr]; !ok {
return // ignore non-existing attributes
return false
}
DoNoBlock(func() {
gl.BindBuffer(gl.ARRAY_BUFFER, va.vbo)
@ -245,6 +250,7 @@ func (va *VertexArray) SetVertexAttribute(vertex int, attr Attr, data unsafe.Poi
panic(errors.Wrap(err, "set attribute vertex error"))
}
})
return true
}
// Do binds a vertex arrray and it's associated vertex buffer, executes sub, and unbinds the vertex array and it's vertex buffer.