上一篇文章我们了解了基础环境搭建,下面我们一起进入最简单的代码部分–你好,窗口(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()

这样便能清理所有的资源并正确地退出应用程序。现在你可以尝试编译并运行你的应用程序了,如果没做错的话,你将会看到如下的输出:

大功告成!

本文涉及到的go源文件:

https://raw.githubusercontent.com/zhonghcc/learnopengl-go/master/01_Getting_Started/HelloWindow.go​raw.githubusercontent.com

应用程序窗口hwnd初始化_Golang OpenGL 跨平台图形程序开发(2)你好,窗口相关推荐

  1. 使用OpenGL,在窗口中绘制两个立体图形,位置分别为窗口的左侧和右侧,添加光照,两个图形分别绕x轴和y轴旋转。

    总体思路: 第一步,使用viewpoint函数来建立两个分割的窗口 第二步,在两个视口分别绘制带光照效果的立体图形 第三步,使用进栈出栈函数和Rotatef函数实现两图像各自的旋转 关于glPushM ...

  2. 按键控制8*8led点阵C语言程序,单片机按键控制8X8LED点阵屏显示图形 程序的几个问题...

    /*        名称:按键控制8X8LED点阵屏显示图形 说明:每次按下K1时,会使8X8LED点阵屏循环显示不同图形. 本例同时使用外部中断和定时中断. */ #include #include ...

  3. 图形程序接口知多少 | OpenGL、OpenCL、Vulkan、OpenGL ES、WebGL、Metal、Directx

    计算机图形程序接口 | Graphics API 对于普通的电脑玩家来说这是一个不重要的东西,但对于游戏开发.玩游戏做三维的人来说,这部分知识可能会常常被提及,尤其是涉及到游戏相关的.计算机图形程序接 ...

  4. OpenGL三维图形编程技术(转)

    人们对三维图形技术的研究已经经历了一个很长的历程,而且涌现了许多三维图形开发工具,其中SGI公司推出的GL(Graphics Library)三维图形库表现尤为突出,它易于使用且功能强大.随着计算机技 ...

  5. OpenGL基础图形编程

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

  6. 【转】OpenGL基础图形编程(一)

    原文:http://blog.chinaunix.net/uid-20638550-id-1909183.html  分类: 一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 ...

  7. OpenGL基础图形编程(转)

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

  8. OpenGL基础图形编程(一)

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

  9. OpenGL三维图形编程技术【转】

    一.OpenGL 的发展历史 人们对三维图形技术的研究已经经历了一个很长的历程,而且涌现了许多三维图形开发工具,其中SGI公司推出的GL(Graphics Library)三维图形库表现尤为突出,它易 ...

最新文章

  1. 30 篇亮点论文、5 大主题带你一览 ECCV 2020研究趋势
  2. Javascript入门视频教程
  3. Ionic3 UI组件之 ImageLoader
  4. redis-python操作redis
  5. Dubbo源码分析:ProxyFactory
  6. 从零开始学Pytorch(十三)之梯度下降
  7. JfreeChart中文文档
  8. php订单金额分摊算法,PHP付钱找钱算法
  9. 配置dhcp服务器和dhcp中继
  10. 计算机win764位相机驱动,Win7万能驱动64位
  11. android 8 刷机教程视频教程,教你Android 8.0的刷机教程
  12. html的实习报告,HTML实习报告
  13. 计算机网络的简单实验
  14. python xlwt表格写入操作
  15. rgb 与 #开头16进制 HEX颜色值关系转换,颜色值透明度的百分数对应十六进制表
  16. 合成大西瓜(西瓜雨版)及改版思路(保姆式教程)
  17. Android学习笔记之AndroidManifest.xml文件解析(学习别人的..非原创)
  18. php使用百度地图,调用百度地图
  19. From line 6, column 36 to line 6, column 71: Cannot apply ‘-‘ to arguments of type ‘<VARCHAR(214748
  20. 自制手机app的51蓝牙+WiFi+循迹+避障OLED显示速度小车

热门文章

  1. linux下安装虚拟天文馆,如何在Ubuntu 20.04、18.04中安装Stellarium 0.20.0虚拟天文馆
  2. Qt之QObjectCleanupHandler使用介绍
  3. python(numpy,pandas8)——pandas大范围赋值和增加特定数据,处理丢失数据(nan)
  4. 信息论4—多符号离散信道,单维连续信道
  5. 怎样快速画出一个正方体_人教版小学数学五年级下册 长方体和正方体的体积 教案、课件,公开课视频...
  6. 优化查询、访问量大时的优化
  7. python事件触发机制_Python3-事件驱动、IO模型和触发方式
  8. 图像编解码:CRF(质量/码率控制)和QP
  9. 文本显示变量_无代码软件开发文本字符显示设计
  10. css3动画--位移加阴影