Cache uniform/attrib locations+display fps averages over a second

This commit is contained in:
bloeys
2022-02-23 09:05:21 +04:00
parent 15087ac542
commit 94942e55a1
3 changed files with 56 additions and 20 deletions

20
main.go
View File

@ -1,6 +1,7 @@
package main
import (
"fmt"
"runtime"
"github.com/bloeys/assimp-go/asig"
@ -146,13 +147,17 @@ func (g *OurGame) Update() {
imgui.DragFloat3("Cam Pos", &camPos.Data)
}
var dtAccum float32 = 0
var lastElapsedTime uint64 = 0
var framesSinceLastFPSUpdate uint = 0
func (g *OurGame) Render() {
simpleMat.Bind()
cubeMesh.Buf.Bind()
tempModelMat := modelMat.Clone()
rowSize := 10
rowSize := 100
for y := 0; y < rowSize; y++ {
for x := 0; x < rowSize; x++ {
simpleMat.SetUnifMat4("modelMat", &tempModelMat.Translate(gglm.NewVec3(-1, 0, 0)).Mat4)
@ -161,6 +166,19 @@ func (g *OurGame) Render() {
simpleMat.SetUnifMat4("modelMat", &tempModelMat.Translate(gglm.NewVec3(float32(rowSize), -1, 0)).Mat4)
}
simpleMat.SetUnifMat4("modelMat", &modelMat.Mat4)
dtAccum += timing.DT()
framesSinceLastFPSUpdate++
if timing.ElapsedTime() > lastElapsedTime {
avgDT := dtAccum / float32(framesSinceLastFPSUpdate)
g.GetWindow().SDLWin.SetTitle("nMage (" + fmt.Sprint(1/avgDT, " fps)"))
dtAccum = 0
framesSinceLastFPSUpdate = 0
}
lastElapsedTime = timing.ElapsedTime()
}
func (g *OurGame) FrameEnd() {

View File

@ -2,6 +2,7 @@ package materials
import (
"github.com/bloeys/gglm/gglm"
"github.com/bloeys/nmage/asserts"
"github.com/bloeys/nmage/buffers"
"github.com/bloeys/nmage/logging"
"github.com/bloeys/nmage/shaders"
@ -12,6 +13,9 @@ type Material struct {
Name string
ShaderProg shaders.ShaderProgram
TexIDs []uint32
UnifLocs map[string]int32
AttribLocs map[string]int32
}
func (m *Material) Bind() {
@ -33,7 +37,29 @@ func (m *Material) UnBind() {
}
func (m *Material) GetAttribLoc(attribName string) int32 {
return gl.GetAttribLocation(m.ShaderProg.ID, gl.Str(attribName+"\x00"))
loc, ok := m.AttribLocs[attribName]
if ok {
return loc
}
loc = gl.GetAttribLocation(m.ShaderProg.ID, gl.Str(attribName+"\x00"))
asserts.T(loc != -1, "Attribute '"+attribName+"' doesn't exist on material "+m.Name)
m.AttribLocs[attribName] = loc
return loc
}
func (m *Material) GetUnifLoc(uniformName string) int32 {
loc, ok := m.UnifLocs[uniformName]
if ok {
return loc
}
loc = gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
asserts.T(loc != -1, "Uniform '"+uniformName+"' doesn't exist on material "+m.Name)
m.UnifLocs[uniformName] = loc
return loc
}
func (m *Material) SetAttribute(bufObj buffers.Buffer) {
@ -66,43 +92,35 @@ func (m *Material) DisableAttribute(attribName string) {
}
func (m *Material) SetUnifInt32(uniformName string, val int32) {
loc := gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
gl.ProgramUniform1i(m.ShaderProg.ID, loc, val)
gl.ProgramUniform1i(m.ShaderProg.ID, m.GetUnifLoc(uniformName), val)
}
func (m *Material) SetUnifFloat32(uniformName string, val float32) {
loc := gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
gl.ProgramUniform1f(m.ShaderProg.ID, loc, val)
gl.ProgramUniform1f(m.ShaderProg.ID, m.GetUnifLoc(uniformName), val)
}
func (m *Material) SetUnifVec2(uniformName string, vec2 *gglm.Vec2) {
loc := gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
gl.ProgramUniform2fv(m.ShaderProg.ID, loc, 1, &vec2.Data[0])
gl.ProgramUniform2fv(m.ShaderProg.ID, m.GetUnifLoc(uniformName), 1, &vec2.Data[0])
}
func (m *Material) SetUnifVec3(uniformName string, vec3 *gglm.Vec3) {
loc := gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
gl.ProgramUniform3fv(m.ShaderProg.ID, loc, 1, &vec3.Data[0])
gl.ProgramUniform3fv(m.ShaderProg.ID, m.GetUnifLoc(uniformName), 1, &vec3.Data[0])
}
func (m *Material) SetUnifVec4(uniformName string, vec4 *gglm.Vec4) {
loc := gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
gl.ProgramUniform4fv(m.ShaderProg.ID, loc, 1, &vec4.Data[0])
gl.ProgramUniform4fv(m.ShaderProg.ID, m.GetUnifLoc(uniformName), 1, &vec4.Data[0])
}
func (m *Material) SetUnifMat2(uniformName string, mat2 *gglm.Mat2) {
loc := gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
gl.ProgramUniformMatrix2fv(m.ShaderProg.ID, loc, 1, false, &mat2.Data[0][0])
gl.ProgramUniformMatrix2fv(m.ShaderProg.ID, m.GetUnifLoc(uniformName), 1, false, &mat2.Data[0][0])
}
func (m *Material) SetUnifMat3(uniformName string, mat3 *gglm.Mat3) {
loc := gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
gl.ProgramUniformMatrix3fv(m.ShaderProg.ID, loc, 1, false, &mat3.Data[0][0])
gl.ProgramUniformMatrix3fv(m.ShaderProg.ID, m.GetUnifLoc(uniformName), 1, false, &mat3.Data[0][0])
}
func (m *Material) SetUnifMat4(uniformName string, mat4 *gglm.Mat4) {
loc := gl.GetUniformLocation(m.ShaderProg.ID, gl.Str(uniformName+"\x00"))
gl.ProgramUniformMatrix4fv(m.ShaderProg.ID, loc, 1, false, &mat4.Data[0][0])
gl.ProgramUniformMatrix4fv(m.ShaderProg.ID, m.GetUnifLoc(uniformName), 1, false, &mat4.Data[0][0])
}
func (m *Material) Delete() {
@ -130,5 +148,5 @@ func NewMaterial(matName, shaderPath string) *Material {
shdrProg.AttachShader(fragShader)
shdrProg.Link()
return &Material{Name: matName, ShaderProg: shdrProg}
return &Material{Name: matName, ShaderProg: shdrProg, UnifLocs: make(map[string]int32), AttribLocs: make(map[string]int32)}
}

View File

@ -20,7 +20,7 @@ func FrameEnded() {
dt = float32(time.Since(frameStart).Seconds())
}
//DT is frame deltatime in milliseconds
//DT is frame deltatime in seconds
func DT() float32 {
return dt
}