OpenGLを勉強する必要に迫られたが、せっかくなのでこちらも勉強中のD言語でやってみることにした。
DebianだとDerelict3もGLFW3もパッケージがまだ無いため自前で入れる。
追記(4/20):libglfw3入ったようです。
https://packages.debian.org/unstable/main/libglfw3
GLFW3 をインストール
CMakeLists.txtのBUILD_SHARED_LIBS をONにしておく。
BUILD_SHARED_LIBSがOFFのままだと静的ライブラリしか作られないが、Derelictはlibglfw3.soを動的にリンクしようとするので実行時にコケる。
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 743e72d..1c4498c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,7 +10,7 @@ set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}")
set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}")
set(LIB_SUFFIX "" CACHE STRING "Takes an empty string or 64. Directory where lib will be installed: lib or lib64")
-option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
+option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON)
option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON)
option(GLFW_BUILD_DOCS "Build the GLFW documentation" ON)
ビルド
$ git clone https://github.com/glfw/glfw.git
$ cd glfw
$ cmake .
$ make
$ sudo make install
cmakeのときにRandRが無いって怒られたので
$ sudo aptitude install libxrandr-dev
した。
Derelict3 をビルド
Debianにはdmdパッケージはないのでldc(ldmd2)でビルドする。
$ git clone https://github.com/aldacron/Derelict3.git
$ cd Derelict3/build
$ ldmd2 build.d
$ ./build Util GL3 GLFW3
パッケージは
Derelict3/import
ライブラリは
Derelict3/lib/ldc
にそれぞれ作成される。
https://github.com/aldacron/Derelict3
READMEには特に特定のディレクトリへのインストール方法などは記載されていなかったので、今回は上のディレクトリをMakefileに直接指定することにする。
テストコードを書いてみる
http://www.glfw.org/docs/3.0/quick.html
ここを参考に。
エラー処理等は今回は省略
import derelict.opengl3.gl;
import derelict.opengl3.gl3;
import derelict.glfw3.glfw3;
import std.stdio;
void main() {
DerelictGL.load();
DerelictGLFW3.load();
glfwInit();
auto window = glfwCreateWindow(800, 600, "Hello, GLFW3!", null, null);
glfwMakeContextCurrent(window);
while(!glfwWindowShouldClose(window)){
int width, height;
glfwGetFramebufferSize(window, &width, &height);
immutable ratio = width / cast(float) height;
glViewport(0, 0, width, height);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-ratio, ratio, -1., 1., 1., -1.);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(cast(float) glfwGetTime() * 50., 0., 0., 1.);
glBegin(GL_TRIANGLES);
glColor3f(1., 0., 0.);
glVertex3f(-0.6, -0.4, 0.);
glColor3f(0., 1., 0.);
glVertex3f(0.6, -0.4, 0.);
glColor3f(0., 0., 1.);
glVertex3f(0., 0.6, 0.);
glEnd();
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
}
以下Makefile
コード内にpragma(lib, "DerelictGL3");
と書けば本来は-L-lDerelictGL3
のような記述は必要ないはずだが、リンクエラーが出てしまうため記載。
P:=openwindow
DC:=ldmd2
SRCS:=openwindow.d
INCLUDES:=$(HOME)/work/Derelict3/import/
LIBS:=-L-L$(HOME)/work/Derelict3/lib/ldc/ -L-lDerelictGL3 -L-lDerelictGLFW3 -L-lDerelictUtil
$(P): $(SRCS)
$(DC) -of$(P) -I$(INCLUDES) $(LIBS) $(SRCS)
clean:
-rm -f openwindow.o openwindow
.PHONY: clean
出力はこんな感じ。三角形がくるくる回る。