应用程序窗口hwnd初始化_Golang OpenGL 跨平台图形程序开发(2)你好,窗口
上一篇文章我們了解了基礎環境搭建,下面我們一起進入最簡單的代碼部分–你好,窗口(hello window)
本部分教程主要來自learn opengl cn (https://learnopengl-cn.github.io/)可參照學習
Let's begin
讓我們試試能不能讓GLFW正常工作。首先,新建一個HelloWindow.go文件,然后把下面的代碼粘貼到該文件的最前面。
package main import ("log""runtime""github.com/go-gl/gl/v3.3-core/gl""github.com/go-gl/glfw/v3.2/glfw" )接下來我們創建main函數,在這個函數中我們將會實例化GLFW窗口:
func main() {runtime.LockOSThread()if err := glfw.Init(); err != nil {panic(err)}// glfw.WindowHint(glfw.Resizable, glfw.False)glfw.WindowHint(glfw.ContextVersionMajor, 3) //OpenGL最大版本glfw.WindowHint(glfw.ContextVersionMinor, 3) //OpenGl最小版本glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) //明確核心模式glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) //Mac使用首先,我們在main函數中調用glfw.Init函數來初始化GLFW,然后我們可以使用glfw.WindowHint函數來配置GLFW。glfw.WindowHint函數的第一個參數代表選項的名稱,我們可以從很多以GLFW_開頭的枚舉值中選擇;第二個參數接受一個整型,用來設置這個選項的值。該函數的所有的選項以及對應的值都可以在 GLFW’s window handling 這篇文檔中找到。
由于本站的教程都是基于OpenGL 3.3版本展開討論的,所以我們需要告訴GLFW我們要使用的OpenGL版本是3.3,這樣GLFW會在創建OpenGL上下文時做出適當的調整。這也可以確保用戶在沒有適當的OpenGL版本支持的情況下無法運行。我們將主版本號(Major)和次版本號(Minor)都設為3。我們同樣明確告訴GLFW我們使用的是核心模式(Core-profile)。明確告訴GLFW我們需要使用核心模式意味著我們只能使用OpenGL功能的一個子集(沒有我們已不再需要的向后兼容特性)。如果使用的是Mac OS X系統,你還需要加下面這行代碼到你的初始化代碼中這些配置才能起作用(將上面的代碼解除注釋):
glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) //Mac使用接下來我們創建一個窗口對象,這個窗口對象存放了所有和窗口相關的數據,而且會被GLFW的其他函數頻繁地用到。
window, err := glfw.CreateWindow(800, 600, "LearnOpenGL", nil, nil)log.Println("created window")if window == nil || err!= nil {panic(err)}window.MakeContextCurrent()//通知glfw將當前窗口上下文設置為線程主上下文glfw.CreateWindow函數需要窗口的寬和高作為它的前兩個參數。第三個參數表示這個窗口的名稱(標題),這里我們使用`LearnOpenGL`,當然你也可以使用你喜歡的名稱。最后兩個參數我們暫時忽略。這個函數將會返回一個GLFWwindow對象,我們會在其它的GLFW操作中使用到。創建完窗口我們就可以通知GLFW將我們窗口的上下文設置為當前線程的主上下文了。
視口
在我們開始渲染之前還有一件重要的事情要做,我們必須告訴OpenGL渲染窗口的尺寸大小,即視口(Viewport),這樣OpenGL才只能知道怎樣根據窗口大小顯示數據和坐標。我們可以通過調用glViewport函數來設置窗口的維度(Dimension):
gl.Viewport(0, 0, 800, 600)glViewport函數前兩個參數控制窗口左下角的位置。第三個和第四個參數控制渲染窗口的寬度和高度(像素)。
我們實際上也可以將視口的維度設置為比GLFW的維度小,這樣子之后所有的OpenGL渲染將會在一個更小的窗口中顯示,這樣子的話我們也可以將一些其它元素顯示在OpenGL視口之外。
然而,當用戶改變窗口的大小的時候,視口也應該被調整。我們可以對窗口注冊一個回調函數(Callback Function),它會在每次窗口大小被調整的時候被調用。
window.SetFramebufferSizeCallback(framebuffer_size_callback)//主流程中設置回調函數func framebuffer_size_callback(window *glfw.Window, width int , height int){log.Printf("resize width:%d,height:%d",width,height)gl.Viewport(0, 0, int32(width), int32(height)) }準備好你的引擎
我們可不希望只繪制一個圖像之后我們的應用程序就立即退出并關閉窗口。我們希望程序在我們主動關閉它之前不斷繪制圖像并能夠接受用戶輸入。因此,我們需要在程序中添加一個while循環,我們可以把它稱之為渲染循環(Render Loop),它能在我們讓GLFW退出前一直保持運行。下面幾行的代碼就實現了一個簡單的渲染循環:
//渲染循環for !window.ShouldClose(){//用戶輸入processInput(window)//渲染gl.ClearColor(0.2, 0.3, 0.3, 1.0)//狀態設置gl.Clear(gl.COLOR_BUFFER_BIT)//狀態使用//檢查調用事件,交換緩沖glfw.PollEvents() window.SwapBuffers()}- glfwWindowShouldClose函數在我們每次循環的開始前檢查一次GLFW是否被要求退出,如果是的話該函數返回true然后渲染循環便結束了,之后為我們就可以關閉應用程序了。
- glfwPollEvents函數檢查有沒有觸發什么事件(比如鍵盤輸入、鼠標移動等)、更新窗口狀態,并調用對應的回調函數(可以通過回調方法手動設置)。
- glfwSwapBuffers函數會交換顏色緩沖(它是一個儲存著GLFW窗口每一個像素顏色值的大緩沖),它在這一迭代中被用來繪制,并且將會作為輸出顯示在屏幕上。
最后一件事
當渲染循環結束后我們需要正確釋放/刪除之前的分配的所有資源。我們可以在main函數的最后調用glfwTerminate函數來完成。在go語言中,我們通過defer來最終執行這個函數。
defer glfw.Terminate()這樣便能清理所有的資源并正確地退出應用程序?,F在你可以嘗試編譯并運行你的應用程序了,如果沒做錯的話,你將會看到如下的輸出:
大功告成!
本文涉及到的go源文件:
https://raw.githubusercontent.com/zhonghcc/learnopengl-go/master/01_Getting_Started/HelloWindow.go?raw.githubusercontent.com總結
以上是生活随笔為你收集整理的应用程序窗口hwnd初始化_Golang OpenGL 跨平台图形程序开发(2)你好,窗口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python信号分析_Python频谱分
- 下一篇: mybatisplus修改单个属性_第二