読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

Macでglfwのサンプルを動かしてハマりそうになった事

おはようございます。次男は「ママ」が未だに言えず、何でも「パパ」といいます。kjunichiです。

背景

Rustでシダを描画したくで、gl-rsのサンプルを眺めているが、どうもこれ、OpenGLではなく、OpenGL ESで書かれいる模様。

自分はOpenGLはなんとなくユルフワで理解できるが、OpenGL ESは古くはAndroid、最近では、1世代前のKindle Fire HDでちょっと動かしたくらいで、どうにも分からないことが多い。

また、WebGLをiOS8でも使っていたりするが、これもThree.jsでラップして使っているので、glBufferなんちゃら系が今ひとつ理解出来ていない。

そんな訳で、C言語でフツーにOpenGL ESを書けないものかと探していたら、OpenGL界隈では有名な床井研究室のページでGLSLのエントリーを発見。

XCodeはできるだけ避けてる人生だった

Githubでサンプルが落とせた

git clone https://github.com/tokoik/glfwsample.git

アラフォーには、iOSの新しいのが出る度にGUIが変更されてしまうXCodeには正直付いて行きたくないので、クラシカルなMakefileを使って作業を試みた。

atom.ioで開くと、文字化けしていたので、ソースをUTF8に変換した。

MakefileLinux向けにあったので、そのままmakeした。

% make

c++ -I/usr/X11R6/include -DX11 -Wall   -c -o gg.o gg.cpp

c++ -I/usr/X11R6/include -DX11 -Wall   -c -o main.o main.cpp

c++ -I/usr/X11R6/include -DX11 -Wall    gg.o main.o  libglfw_linux.a -L/usr/X11R6/lib -lX11 -lGL -lXrandr -lrt -lpthread -lm -o glfwsample

ld: library not found for -lrt

clang: error: linker command failed with exit code 1 (use -v to see invocation)

make: *** [glfwsample] Error 1

となったので、-lrtMakefileから削除したら、今度は、

ld: warning: ignoring file libglfw_linux.a, file was built for archive which is not the architecture being linked (x86_64): libglfw_linux.a

というこで、-lglfwを追加して、これでビルド出来た。

VRAMのゴミが表示される感じ

動くが画面がVRMAの領域の一部がぐしゃぐしゃっと表示される。

X11リンクしてるがXquartzが動いてないぞ

aquaで動いているから、X11関連要らなそう、というこで、Makefileを以下のようにOpenGL系はフレームワークを使うように変更

CXXFLAGS    =  -Wall

LDLIBS  = -lglfw -lm -framework opengl

OBJECTS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))

TARGET  = glfwsample

.PHONY: clean depend

$(TARGET): $(OBJECTS)

    $(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@

clean:

    -$(RM) $(TARGET) *.o *~ .*~ core

depend:

    $(CXX) $(CXXFLAGS) -MM *.cpp > $(TARGET).dep

-include $(wildcard *.dep)

動いた。

Glfw_sample01

まとめ

OSXではX11も使えるので、OpenGL系なコードは今後もリンクするライブラリに注意が必要。

-lX11 -lGL

は削除して、

-frameowrk OpenGL