openGL with D

来源:互联网 发布:药源网手机数据库 编辑:程序博客网 时间:2024/06/06 19:11

 First Step

  1. 最近Go语言玩腻了,所以在折腾D lang,所以下面都是用D写的,如果你不了解Dlang,那么这里会是一个不错的开始。
  2. 环境是MacOS with MacMini(2012冬),所以你会看到连接选项和linux不一样,如果你用linux上的选项(而不是pkg-config提供的),那么只能看到黑色的屏幕。
  3. Go与glfw的相性特别差,是程库初始化时的问题。你会很高兴的看到MacOS报错,告诉你只能创建一个窗口。
  4. 如果你不了解glfw,那么它的官网足够了解一切内容。
  5. gl、glu、glfw的声明文件需要自己写,如果你不想折腾,那么可以参考这里。

首先,作为练手,我们先来写交互式计算机图形学中的第一个例子——创建一个Sierpinski triangle。在后面,我们会逐步了解交互,贴图,光照,结合freetype生成文字,读取obj文件,读取x文件,最后小小的尝试下动画。当然,仅凭这些是不可能写出一个合格的游戏的,但至少我们可以尝试下文字冒险,当然你可能会想写一个RPG Maker出来。
当然,前提是如果我有足够时间和耐心继续写博客的话。

总之先跳过那些理论和准备工作,最快的搞出一个能运行的版本才是激发兴趣的保证,所以先用下面的这个声明凑数,到后面渐渐地你可以把他们整合进单独的文件里。


这些函数我们真正用到的其实很少,你可以参考GLFW User Guide来选择性的写自己的声明。
首先创建一个最简单的窗口,但我希望你能参考GLFW的用户指南来完成,而不是直接拷贝代码。总之,写出来大概是下面这个样子。


值得注意的是这里的窗口并没有开启深度测试,不要抱怨为什么后面(或许在第二篇里)我们写了Enable Depth Test却没有效果。这种问题在StackOverflow上也经常可以看到。当然,这次我们仅仅生成二维图形,有没有深度测试没有什么意义。
写完这些,总之可以先加上
int init(){    return 0;}void draw(){}

来编译下,看看我们的窗口。
如果直接
dmd test.d
的话你会看到一堆链接错误
Undefined symbols for architecture x86_64:  "_glClear", referenced from:      __Dmain in Sierpinski.o      _D10Sierpinski4drawFZv in Sierpinski.o  "_glClearColor", referenced from:      __Dmain in Sierpinski.o  "_glViewport", referenced from:      __Dmain in Sierpinski.o  "_glfwGetKey", referenced from:      __Dmain in Sierpinski.o  "_glfwGetWindowParam", referenced from:      __Dmain in Sierpinski.o  "_glfwGetWindowSize", referenced from:      __Dmain in Sierpinski.o  "_glfwInit", referenced from:      __Dmain in Sierpinski.o  "_glfwOpenWindow", referenced from:      __Dmain in Sierpinski.o  "_glfwSwapBuffers", referenced from:      __Dmain in Sierpinski.o  "_glfwSwapInterval", referenced from:      _D10Sierpinski4initFZi in Sierpinski.o  "_glfwTerminate", referenced from:      __Dmain in Sierpinski.o  "_gluOrtho2D", referenced from:      _D10Sierpinski4initFZi in Sierpinski.old: symbol(s) not found for architecture x86_64collect2: ld returned 1 exit status--- errorlevel 1

正确的方法是首先运行
dmd -v test.d 2>/dev/null | grep gcc

你会得到gcc的编译选项
gcc test.o -o test -m64 -L/usr/share/dmd/lib -lphobos2 -lpthread -lm

然后需要加上opengl和glfw的编译选项,当然,你需要安装pkg-config。
最后应该是这个样子:
gcc test.o -o test -m64 -L/usr/share/dmd/lib -lphobos2 -lpthread -lm `pkg-config --libs libglfw gl glu`

实际上,dmd有自己的链接选项,
dmd | grep link
可以看到-L可以将选项传送到gcc,但是在太难用,所以我们还是选择直接用gcc链接。(其实我更喜欢clang)
dmd -c test.d
得到*.o,然后用gcc得到可执行文件。


好了,有了一个简单的框架,终于可以写opengl相关的代码了,首先我们来初始化:


glfwSwapInerval是垂直同步相关的选项,细节可以参考GLFW Reference。
这里做的事情很简单,我们选用了正投影,更详细的理论内容可以参考任何一本opengl教材。

下面就是描画了,代码看起来没那么复杂:


这里我们用了随机的方法去描画它: 首先随机选取一点,这一点和任意某个三角形定点相连,取其中点。
为了简单,我们把数值都直接写进了代码里,或许你希望每次初始点是随机的,那么你可以尝试自己实现一下,而这个判断点与三角形关系的方法在亚马逊的下拉菜单里可以用到。
总之编译,运行,来看看结果:




esc关掉它,我们就完成了第一课。

原创粉丝点击