ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

HaskellコミュのOpenGLで

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。 Haskell歴1ヶ月で、苦戦しております。

Haskell+OpenGLに挑戦しているのですが、どうしても、でぷすバッファが利かないようなのですが、どうしてでしょうか?


import Graphics.UI.GLUT

initWindowSize = Size 500 500
initLightPos = Vertex4 1.0 1.0 (1.0) 1.0

main = do
getArgsAndInitialize
initialDisplayMode $= [RGBAMode, WithDepthBuffer, DoubleBuffered]
initialWindowSize $= initWindowSize
w <- createWindow "My Sample"
displayCallback $= display
reshapeCallback $= Just myReshape
myinit
reportErrors
mainLoop

-- reshape callback
myReshape :: ReshapeCallback
myReshape (Size w h) = do
viewport $= ( (Position 0 0), (Size w h) )

-- my initialize function
myinit = do
lighting $= Enabled
position (Light 0) $= initLightPos
light (Light 0) $= Enabled

-- Display Callback
display :: DisplayCallback
display = do
clear [ColorBuffer, DepthBuffer]
renderObject Solid $ Teapot 0.5
renderObject Solid $ Sphere' 0.4 8 8
swapBuffers
reportErrors


バージョンは、
Glasgow Haskell Compiler, Version 6.6, for Haskell 98, compiled by GHC version 6.6
です。

コメント(4)

もう解決してしまったかもしれませんが、depthFunc を使っていないためではないでしょうか?

depthFunc $= Just Less というコードを加えてみてください。
shelarcyさんありがとうございます。


遅くなってしまいましたすいません。
depthFuncを指定したら無事、解決しました。

OpenGLではglDepthFuncはデフォルト設定でOKなんですが、、、

いろいろなHPでもありますが、関数型言語って、やっぱり3Dとか、画像関係にはあまりなじまないんでしょうか。。

なんか、関数型言語で面白いこと出来ないかな〜
とは思うのですが、、
> OpenGLではglDepthFuncはデフォルト設定でOKなんですが、、、

正確には glEnable(GL_DEPTH_TEST)で有効化すると、初期値の GL_LESS が使われるということですよね?

http://tpot.jpn.ph/t-pot/program/62_glut3d/index.html
http://www.westernvillage.co.jp/openglprogram.htm

これは単に、プログラミングスタイルの問題なのではないかと思います。

Haskell 的には、暗黙に状態を持つよりも明示的に宣言として与えるようにした方が望ましい、と考えたのではないでしょうか? 代わりに glEnable をいちいち呼ばなくて良いよう、Maybe を使うことで内部で自動的に呼ぶようにしていますね。

> いろいろなHPでもありますが、関数型言語って、やっぱり3Dとか、画像関係にはあまりなじまないんでしょうか。。

そんなことはないと思います。

Lisp は古くから CG に使われていますし、

http://practical-scheme.net/wiliki/wiliki.cgi?Lisp%3a%e3%82%88%e3%81%8f%e3%81%82%e3%82%8b%e8%aa%a4%e8%a7%a3

望む絵を作るには、いかにプログラムにバグが入り込まないかが重要になることも多いでしょう。些細な部分でバグが入り込んでしまうことで、CG との間の相互作用性が阻害され、全体的なスループットが低下することを考えれば、そのようなバグが入り込むのを防げる力を持つ関数型言語の方がアドバンテージを持っていると思います。

http://page.freett.com/shelarcy/log/2006/diary_06.html#minaduki182006

パフォーマンスに拘る場合でも、その辺のスクリプト言語とは違い、C に頼らずに言語単体でチューニングしていくこともできますし。


そういう議論はさておき、Haskell Game Magazine の方でも書いていますが、Haskell で画像関係のことをやりたいというのであれば協力しますよ。

http://mixi.jp/view_bbs.pl?page=1&comm_id=901947&id=6797890

画像系のライブラリは色々とあるものの、作りっぱなしで放置されているものが多いので、統合できれば良いと思いますし。

https://www.haskell.org/haskellwiki/H3D#Suggestions_-_idea.27s_-_stuff_we_can_use
http://haskell.org/haskellwiki/Libraries_and_tools/Graphics
(注意:記事の性質上、重複や関数型言語でないものを含みます。)

http://users.info.unicaen.fr/~karczma/Work/Clastic_distr/clastic.html
(注意:Haskell ではなく、Clean です。)

http://haskell.org/haskellwiki/Frag
shelarcyさん ありがとうございます。

ライティングは
lighting $= Enabled
と書くのに、デプスはglDepthFuncの対応物(?)を使って、
depthFunc $= Just Less
なんですね。。OpenGLのコードをそのまんまコピーというわけにはいかないんでしょうか。なんで初期値がGL_LESSでないのかというのは。。。OpenGLそのまんまではないんですね。


“関数型言語なCG”と考えたとき、フラクタル図形のような、アルゴリズムがそのまま出力となるようなCGは、関数型言語に馴染みやすいかな、、とは思っていたのですが。


作ってみたものが、ごく小さいものだったからでしょうか。Haskellを良く知らないからでしょうか。
画像の出力とか、マウスを始めとした、インタラクティブな入力は、副作用ですよね(?)。
全体がモナドになってしまって、“これじゃあCとなんも変わらないじゃん・・・”と。思ったのです。


開発作業でバグが入りにくいということも感じました。VisuakHaskellを使っているのですが、文法ミスはすぐにそれと判りますし、、(どこかのサイトにあった言葉ですが、)コンパイルが通ればほぼバグ取りされている、、のような。

リンクの中にあった、Monadiusの例などを見ると、関数型言語で、“抽象概念としてゲーム”が記述できることは、かなりアドバンテージに思えます。きちんとした設計思想と、Haskellの知識がないと、Haskellでゲームというのは難しそうに思いました。



たくさんの参考リンクありがとうございます。
これからよく勉強します。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Haskell 更新情報

Haskellのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング