openGL with D
来源:互联网 发布:药源网手机数据库 编辑:程序博客网 时间:2024/06/06 19:11
First Step
- 最近Go语言玩腻了,所以在折腾D lang,所以下面都是用D写的,如果你不了解Dlang,那么这里会是一个不错的开始。
- 环境是MacOS with MacMini(2012冬),所以你会看到连接选项和linux不一样,如果你用linux上的选项(而不是pkg-config提供的),那么只能看到黑色的屏幕。
- Go与glfw的相性特别差,是程库初始化时的问题。你会很高兴的看到MacOS报错,告诉你只能创建一个窗口。
- 如果你不了解glfw,那么它的官网足够了解一切内容。
- 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关掉它,我们就完成了第一课。
- openGL with D
- 3D with opengl-------android
- 3D Graphics with OpenGL-Basic Theory
- 3D Graphics with OpenGL Basic Theory
- OpenGL 基础知识-3D Graphics with OpenGL Basic Theory
- 3D Computer Graphics : A Mathematical Introduction with OpenGL
- Mobile 3D Graphics: with OpenGL ES and M3G
- obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES
- Using OpenGL ES to Accelerate Apps with Legacy 2D GUIs
- Using OpenGL ES to Accelerate Apps with Legacy 2D GUIs
- Using OpenGL with MFC
- Using OpenGL with MFC
- Something with OpenGL
- OpenGL with C programming
- OpenGL Interoperability with CUDA
- Rubber-Banding with OpenGL
- opencv with opengl support
- AntTweakBar with OpenGL
- srand()以及rand()函数用法(zz)
- NSInteger 与 NSUInteger 和 int与 NSInteger 区别
- 串并口引脚定义
- @synthesize window=_window; 的理解
- 深入浅出之正则表达式(一)
- openGL with D
- 关于dedecms织梦后台的三个问题的解决方法
- 学习android需要掌握的Java知识点(百度文库)
- copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理
- dba 常用查询
- ubuntu
- LS 24 Bracket sequence(DP)
- 应用程序的业务图景仍在不断变化
- Android XmlPullParser工具解析