package main import ( "fmt" "runtime" "git.tek.govt.hu/dowerx/opengl-deferred/types/gbuffer" "git.tek.govt.hu/dowerx/opengl-deferred/types/geometry" "git.tek.govt.hu/dowerx/opengl-deferred/types/light" "git.tek.govt.hu/dowerx/opengl-deferred/types/material" am "git.tek.govt.hu/dowerx/opengl-deferred/utils/assetmanager" "git.tek.govt.hu/dowerx/opengl-deferred/utils/fpscontrols" "github.com/go-gl/gl/v4.6-core/gl" "github.com/go-gl/glfw/v3.3/glfw" "github.com/go-gl/mathgl/mgl32" ) const ( WIDTH = 1280 HEIGHT = 720 TITLE = "opengl-deferred" FOV = 75.0 ) func main() { // init glfw runtime.LockOSThread() if err := glfw.Init(); err != nil { panic(err) } defer glfw.Terminate() glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.ContextVersionMajor, 4) glfw.WindowHint(glfw.ContextVersionMinor, 6) glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) window, err := glfw.CreateWindow(WIDTH, HEIGHT, TITLE, nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() // init gl if err := gl.Init(); err != nil { panic(err) } gl.Enable(gl.CULL_FACE) gl.DepthFunc(gl.LESS) gl.ClearColor(0, 0, 0, 1) fmt.Println("OpenGL version:", gl.GoStr(gl.GetString(gl.VERSION))) // load assets assetManager, err := am.Init("assets") if err != nil { panic(err) } defer assetManager.Destroy() screen, err := geometry.Screen() if err != nil { panic(err) } defer screen.Delete() // lights lights := []light.Light{ {Color: [3]float32{1, 1, 1}, Position: mgl32.Vec3{0, 10, 0}, Intensity: 40, Type: light.POINT}, {Color: [3]float32{1, 0, 0}, Position: mgl32.Vec3{5, 5, 5}, Intensity: 30, Type: light.POINT}, {Color: [3]float32{0, 0, 1}, Position: mgl32.Vec3{-5, 5, -5}, Intensity: 30, Type: light.POINT}, } // gbuffer gbuff, err := gbuffer.New(WIDTH, HEIGHT) if err != nil { panic(err) } defer gbuff.Delete() gbuff.Bind() // transformations projection := mgl32.Perspective(mgl32.DegToRad(FOV), float32(WIDTH)/HEIGHT, 0.1, 1000) model := mgl32.Ident4() controls := fpscontrols.Get(10, 10, mgl32.Vec3{0, 0, -10}, mgl32.Vec2{0, 0}, window) demoMaterial := am.GetAsset[material.Material]("assets/material/demo") screenMaterial := am.GetAsset[material.Material]("assets/material/screen-debug") teapot := am.GetAsset[geometry.Geometry]("assets/geometry/teapot") for !window.ShouldClose() { glfw.PollEvents() controls.Update() // first pass gl.Enable(gl.DEPTH_TEST) gbuff.Bind() gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // apply the material demoMaterial.Apply() // transfer uniforms demoMaterial.Shader.Mat4("projection", projection) demoMaterial.Shader.Mat4("view", controls.View()) demoMaterial.Shader.Mat4("model", model) teapot.Draw() // second pass gl.Disable(gl.DEPTH_TEST) gl.BindFramebuffer(gl.FRAMEBUFFER, 0) gl.Clear(gl.COLOR_BUFFER_BIT) gbuff.BindTextures() screenMaterial.Apply() pos := controls.Position() screenMaterial.Shader.Vec3("view_pos", &pos[0]) for _, light := range lights { screenMaterial.Shader.Light(&light) } screen.Draw() window.SwapBuffers() } defer fmt.Println("exiting...") }