Nim使用OpenGL

这里说明了Nim如何使用OpenGL

Nimble换源

因为我们要下载SDL2OpenGL的支持,所以可以考虑将Nimble换成国内源。方法如下:
首先到Nimble官网clone他的代码下来。
然后进入到src/nimblepkg/download.nim文件中,将

1
2
if modUrl.contains("github.com") and modUrl.endswith("/"):
  modUrl = modUrl[0 .. ^2]

换成

1
2
3
4
if modUrl.contains("github.com"):
  modUrl = modUrl.replace("github.com","github.com.cnpmjs.org")
  if modUrl.endswith("/"):
   modUrl = modUrl[0 .. ^2]

其实就是将github换成国内的镜像网站github.com.cnpmjs.org,顺便说一句,平时github登不上去了也可以上这个网站访问。
然后重新编译nimble,到nimble的根目录下执行

1
nimble build

就会生成nimble可执行文件了。然后将文件放到/usr/local/bin/下就可以执行了。
我的习惯是重命名为nimble-zh然后再放。
以后每次下载包使用这个nimble就会很快了。

使用OpenGL

我是使用SDL2搭建窗口,你也可以使用你熟悉的库。

首先安装SDL2OpenGL的包,OpenGL包的官网在这里

1
nimble install sdl2 opengl

然后OpenGL的API是什么,在Nim中就怎么用就行了,这里给个清屏的例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import sdl2
import opengl

if isMainModule:
    sdl2.init(INIT_EVERYTHING)
    defer: sdl2.quit()

    # 设置OpenGL版本
    discard glSetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3)
    discard glSetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3)
    discard glSetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE)

    let window = sdl2.createWindow("test SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 400, 300, SDL_WINDOW_SHOWN or SDL_WINDOW_OPENGL)
    defer: sdl2.destroyWindow(window)

    var glContext = glCreateContext(window)
    defer: glDeleteContext(glContext)

    # 根据OpenGL包的文档,这一句必须加在创建窗口后,加载拓展前
    loadExtensions()

    if glContext.isNil:
        raise newException(Exception, "gl context create failed")

    var shouldClose = false
    var event = sdl2.defaultEvent;
    while not shouldClose:
        while sdl2.pollEvent(event):
            case event.kind:
            of sdl2.QuitEvent:
                shouldClose = true
            else:
                discard

        # 清屏
        glClearColor(0.1, 0.1, 0.1, 1)
        glClear(GL_COLOR_BUFFER_BIT)

        # 绘制屏幕
        glSwapWindow window
        delay 30

参考教程

SCIFX

updatedupdated2023-06-082023-06-08