From 5c9890372376f02881b6c569cc45d86206e8d675 Mon Sep 17 00:00:00 2001 From: bloeys Date: Sun, 15 Sep 2024 16:29:54 +0400 Subject: [PATCH] Add all gl BufUsage values+support bufusage in ubo --- buffers/buf_usage.go | 35 +++++++++++++++++++++++++++++------ buffers/index_buffer.go | 4 ++-- buffers/uniform_buffer.go | 4 ++-- main.go | 8 +++++--- meshes/mesh.go | 2 +- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/buffers/buf_usage.go b/buffers/buf_usage.go index e25a7f2..5f4579d 100755 --- a/buffers/buf_usage.go +++ b/buffers/buf_usage.go @@ -9,25 +9,48 @@ import ( type BufUsage int +// Full docs for buffer usage can be found here: https://registry.khronos.org/OpenGL-Refpages/gl4/html/glBufferData.xhtml const ( BufUsage_Unknown BufUsage = iota //Buffer is set only once and used many times - BufUsage_Static + BufUsage_Static_Draw //Buffer is changed a lot and used many times - BufUsage_Dynamic + BufUsage_Dynamic_Draw //Buffer is set only once and used by the GPU at most a few times - BufUsage_Stream + BufUsage_Stream_Draw + + BufUsage_Static_Read + BufUsage_Dynamic_Read + BufUsage_Stream_Read + + BufUsage_Static_Copy + BufUsage_Dynamic_Copy + BufUsage_Stream_Copy ) func (b BufUsage) ToGL() uint32 { switch b { - case BufUsage_Static: + case BufUsage_Static_Draw: return gl.STATIC_DRAW - case BufUsage_Dynamic: + case BufUsage_Dynamic_Draw: return gl.DYNAMIC_DRAW - case BufUsage_Stream: + case BufUsage_Stream_Draw: return gl.STREAM_DRAW + + case BufUsage_Static_Read: + return gl.STATIC_READ + case BufUsage_Dynamic_Read: + return gl.DYNAMIC_READ + case BufUsage_Stream_Read: + return gl.STREAM_READ + + case BufUsage_Static_Copy: + return gl.STATIC_COPY + case BufUsage_Dynamic_Copy: + return gl.DYNAMIC_COPY + case BufUsage_Stream_Copy: + return gl.STREAM_COPY } assert.T(false, fmt.Sprintf("Unexpected BufUsage value '%v'", b)) diff --git a/buffers/index_buffer.go b/buffers/index_buffer.go index f99dd03..4949f10 100755 --- a/buffers/index_buffer.go +++ b/buffers/index_buffer.go @@ -27,9 +27,9 @@ func (ib *IndexBuffer) SetData(values []uint32) { ib.IndexBufCount = int32(len(values)) if sizeInBytes == 0 { - gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, 0, gl.Ptr(nil), BufUsage_Static.ToGL()) + gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, 0, gl.Ptr(nil), BufUsage_Static_Draw.ToGL()) } else { - gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, sizeInBytes, gl.Ptr(&values[0]), BufUsage_Static.ToGL()) + gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, sizeInBytes, gl.Ptr(&values[0]), BufUsage_Static_Draw.ToGL()) } } diff --git a/buffers/uniform_buffer.go b/buffers/uniform_buffer.go index 52bf278..9728f19 100755 --- a/buffers/uniform_buffer.go +++ b/buffers/uniform_buffer.go @@ -728,7 +728,7 @@ func ReflectValueMatchesUniformBufferField(v reflect.Value, ubField *UniformBuff } } -func NewUniformBuffer(fields []UniformBufferFieldInput) UniformBuffer { +func NewUniformBuffer(fields []UniformBufferFieldInput, usage BufUsage) UniformBuffer { ub := UniformBuffer{} @@ -740,7 +740,7 @@ func NewUniformBuffer(fields []UniformBufferFieldInput) UniformBuffer { } ub.Bind() - gl.BufferData(gl.UNIFORM_BUFFER, int(ub.Size), gl.Ptr(nil), gl.STATIC_DRAW) + gl.BufferData(gl.UNIFORM_BUFFER, int(ub.Size), gl.Ptr(nil), usage.ToGL()) ub.UnBind() return ub diff --git a/main.go b/main.go index 6a9a582..1528328 100755 --- a/main.go +++ b/main.go @@ -39,9 +39,9 @@ import ( - Normals maps ✅ - HDR ✅ - Fix bad point light acne ✅ - - UBO support + - UBO support ✅ - Skeletal animations - - Cascaded shadow mapping + - (?) Cascaded shadow mapping - In some cases we DO want input even when captured by UI. We need two systems within input package, one filtered and one not✅ - (?) Support OpenGL 4.1 and 4.6, and default to 4.6 - Proper model loading (i.e. load model by reading all its meshes, textures, and so on together) @@ -688,7 +688,7 @@ func (g *Game) Init() { // We don't actually care about the values here because the quad is hardcoded in the shader, // but we just want to have a vao with 6 vertices and uv0 so opengl can be called properly screenQuadVbo := buffers.NewVertexBuffer(buffers.Element{ElementType: buffers.DataTypeVec3}, buffers.Element{ElementType: buffers.DataTypeVec2}) - screenQuadVbo.SetData(make([]float32, 6), buffers.BufUsage_Static) + screenQuadVbo.SetData(make([]float32, 6), buffers.BufUsage_Static_Draw) screenQuadVao = buffers.NewVertexArray() screenQuadVao.AddVertexBuffer(screenQuadVbo) @@ -712,6 +712,7 @@ func (g *Game) initUbos() { {Id: 0, Type: buffers.DataTypeVec3}, {Id: 1, Type: buffers.DataTypeMat4}, }, + buffers.BufUsage_Dynamic_Draw, ) globalMatricesUbo.SetBindPoint(0) @@ -760,6 +761,7 @@ func (g *Game) initUbos() { // Ambient {Id: 21, Type: buffers.DataTypeVec3}, // 12 192 }, + buffers.BufUsage_Dynamic_Draw, ) // fmt.Printf("\n==Lights UBO (id=%d)==\nSize=%d\nFields: %+v\n\n", lightsUbo.Id, lightsUbo.Size, lightsUbo.Fields) diff --git a/meshes/mesh.go b/meshes/mesh.go index 051eaf6..91cdbc9 100755 --- a/meshes/mesh.go +++ b/meshes/mesh.go @@ -151,7 +151,7 @@ func NewMesh(name, modelPath string, postProcessFlags asig.PostProcess) (Mesh, e indexBufData = append(indexBufData, indices...) } - vbo.SetData(vertexBufData, buffers.BufUsage_Static) + vbo.SetData(vertexBufData, buffers.BufUsage_Static_Draw) ibo.SetData(indexBufData) mesh.Vao.AddVertexBuffer(vbo)