From da50d597f9c8180f8cee5c4298567c9a2bd74e88 Mon Sep 17 00:00:00 2001 From: bloeys Date: Sat, 7 Oct 2023 10:58:01 +0400 Subject: [PATCH] Control over srgba textures and srgba framebuffer --- assets/textures.go | 22 +++++++++++++++++++--- engine/engine.go | 10 ++++++++++ main.go | 5 +++-- res/models/plane.fbx | Bin 0 -> 11612 bytes ui/imgui/imgui.go | 2 +- 5 files changed, 33 insertions(+), 6 deletions(-) create mode 100755 res/models/plane.fbx diff --git a/assets/textures.go b/assets/textures.go index a40d3b8..fb58ab6 100755 --- a/assets/textures.go +++ b/assets/textures.go @@ -45,6 +45,7 @@ type TextureLoadOptions struct { WriteToCache bool GenMipMaps bool KeepPixelsInMem bool + TextureIsSrgba bool } type Cubemap struct { @@ -102,7 +103,12 @@ func LoadTexturePNG(file string, loadOptions *TextureLoadOptions) (Texture, erro gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) // load and generate the texture - gl.TexImage2D(gl.TEXTURE_2D, 0, gl.SRGB_ALPHA, tex.Width, tex.Height, 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&tex.Pixels[0])) + internalFormat := int32(gl.RGBA8) + if loadOptions.TextureIsSrgba { + internalFormat = gl.SRGB_ALPHA + } + + gl.TexImage2D(gl.TEXTURE_2D, 0, internalFormat, tex.Width, tex.Height, 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&tex.Pixels[0])) if loadOptions.GenMipMaps { gl.GenerateMipmap(tex.TexID) @@ -145,7 +151,12 @@ func LoadTextureInMemPngImg(img image.Image, loadOptions *TextureLoadOptions) (T gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) // load and generate the texture - gl.TexImage2D(gl.TEXTURE_2D, 0, gl.SRGB8_ALPHA8, tex.Width, tex.Height, 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&tex.Pixels[0])) + internalFormat := int32(gl.RGBA8) + if loadOptions.TextureIsSrgba { + internalFormat = gl.SRGB_ALPHA + } + + gl.TexImage2D(gl.TEXTURE_2D, 0, internalFormat, tex.Width, tex.Height, 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&tex.Pixels[0])) if loadOptions.GenMipMaps { gl.GenerateMipmap(tex.TexID) @@ -205,7 +216,12 @@ func LoadTextureJpeg(file string, loadOptions *TextureLoadOptions) (Texture, err gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) // load and generate the texture - gl.TexImage2D(gl.TEXTURE_2D, 0, gl.SRGB8_ALPHA8, tex.Width, tex.Height, 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&tex.Pixels[0])) + internalFormat := int32(gl.RGBA8) + if loadOptions.TextureIsSrgba { + internalFormat = gl.SRGB_ALPHA + } + + gl.TexImage2D(gl.TEXTURE_2D, 0, internalFormat, tex.Width, tex.Height, 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&tex.Pixels[0])) if loadOptions.GenMipMaps { gl.GenerateMipmap(tex.TexID) diff --git a/engine/engine.go b/engine/engine.go index 957f53c..d55c891 100755 --- a/engine/engine.go +++ b/engine/engine.go @@ -198,12 +198,22 @@ func initOpenGL() error { gl.FrontFace(gl.CCW) gl.Enable(gl.BLEND) + gl.Enable(gl.FRAMEBUFFER_SRGB) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.ClearColor(0, 0, 0, 1) return nil } +func SetSrgbFramebuffer(isEnabled bool) { + + if isEnabled { + gl.Enable(gl.FRAMEBUFFER_SRGB) + } else { + gl.Disable(gl.FRAMEBUFFER_SRGB) + } +} + func SetVSync(enabled bool) { assert.T(isInited, "engine.Init was not called!") diff --git a/main.go b/main.go index 4c83799..912432e 100755 --- a/main.go +++ b/main.go @@ -213,7 +213,7 @@ func (g *OurGame) Init() { skyboxMat = materials.NewMaterial("Skybox mat", "./res/shaders/skybox.glsl") //Load meshes - cubeMesh, err = meshes.NewMesh("Cube", "./res/models/tex-cube.fbx", 0) + cubeMesh, err = meshes.NewMesh("Cube", "./res/models/plane.fbx", 0) if err != nil { logging.ErrLog.Fatalln("Failed to load mesh. Err: ", err) } @@ -229,7 +229,7 @@ func (g *OurGame) Init() { } //Load textures - tex, err := assets.LoadTexturePNG("./res/textures/pallete-endesga-64-1x.png", nil) + tex, err := assets.LoadTexturePNG("./res/textures/logo - black bg.png", nil) if err != nil { logging.ErrLog.Fatalln("Failed to load texture. Err: ", err) } @@ -383,6 +383,7 @@ func (g *OurGame) Render() { tempModelMatrix := cubeModelMat.Clone() window.Rend.Draw(chairMesh, tempModelMatrix, matToUse) + tempModelMatrix.Rotate(90*gglm.Deg2Rad, gglm.NewVec3(0, 1, 0)) rowSize := 1 for y := 0; y < rowSize; y++ { for x := 0; x < rowSize; x++ { diff --git a/res/models/plane.fbx b/res/models/plane.fbx new file mode 100755 index 0000000000000000000000000000000000000000..d3fc6ec907b8ba62697f0ad769219af07510fef4 GIT binary patch literal 11612 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 O_jlX>T)ux(+y4OAl{Q!a literal 0 HcmV?d00001 diff --git a/ui/imgui/imgui.go b/ui/imgui/imgui.go index eb735c3..994fb04 100755 --- a/ui/imgui/imgui.go +++ b/ui/imgui/imgui.go @@ -67,7 +67,7 @@ func (i *ImguiInfo) Render(winWidth, winHeight float32, fbWidth, fbHeight int32) i.Mat.Bind() i.Mat.SetUnifInt32("Texture", 0) - //PERF: only update the ortho matrix on window resize + // @PERF: only update the ortho matrix on window resize orthoMat := gglm.Ortho(0, float32(winWidth), 0, float32(winHeight), 0, 20) i.Mat.SetUnifMat4("ProjMtx", &orthoMat.Mat4) gl.BindSampler(0, 0) // Rely on combined texture/sampler state.