2012-02-15 18 views
5

Opengl kullanarak bir go tahtası oluşturmaya çalışıyorum. Bunu yapmak için, ızgarayı oluşturmak için bir grup çizgi çizmeye çalışıyorum. Ancak, her öğretici site (opengl dahil) C++'daki örneklere sahiptir ve Haskell wiki bunu açıklamak için iyi bir iş yapmaz. Ben opengl için yeni ve bir öğretici istiyorum. OpenGL ilk (++ ya da C) aslında bir C kütüphanesi, sen C Ayaklarını ıslatmak isteyebilirsiniz çünkü senden beri, Her durumdaHaskell'de opengl ile çizim çizgileri

http://www.haskell.org/haskellwiki/OpenGLTutorial1

:

cevap

12

OpenGL 2.1 veya önceki sürümlerini kullanmak istediğinizi varsayalım. OpenGL 3.0 için farklı kodlara ihtiyacınız var.

Yani, C yazarsınız: Ben mesela kullanılan beri, bu kod ile

renderPrimitive Lines $ do 
    vertex $ Vertex3 1 2 3 
    vertex $ Vertex3 5 6 7 

:

glBegin(GL_LINES); 
glVertex3f(1, 2, 3); 
glVertex3f(5, 6, 7); 
glEnd(); 

Böyle Haskell eşdeğer yazma 1 bazı değişkenler yerine, belirsiz türlerle ilgili hatalar alabilirsiniz (Bu nedenle 'u (1 :: GLfloat) ile değiştirmelisiniz), ancak GLfloat türüne sahip olan gerçek değişkenleri kullanırsanız, bunu yapmanız gerekmez.

Burada penceresinde beyaz diyagonal çeken bir programdır verilmiştir:

import Graphics.Rendering.OpenGL 
import Graphics.UI.GLUT 

main :: IO() 
main = do 
    -- Initialize OpenGL via GLUT 
    (progname, _) <- getArgsAndInitialize 

    -- Create the output window 
    createWindow progname 

    -- Every time the window needs to be updated, call the display function 
    displayCallback $= display 

    -- Let GLUT handle the window events, calling the displayCallback as fast as it can 
    mainLoop 

display :: IO() 
display = do 
    -- Clear the screen with the default clear color (black) 
    clear [ ColorBuffer ] 

    -- Render a line from the bottom left to the top right 
    renderPrimitive Lines $ do 
    vertex $ (Vertex3 (-1) (-1) 0 :: Vertex3 GLfloat) 
    vertex $ (Vertex3 1 1 0 :: Vertex3 GLfloat) 

    -- Send all of the drawing commands to the OpenGL server 
    flush 

varsayılan OpenGL sabit fonksiyonlu projeksiyon kullanımları (-1, -1) alt için için (1: 1) ve sol pencerenin sağ üst köşesi. Farklı koordinat alanları elde etmek için projeksiyon matrisini değiştirmeniz gerekir.

Bunun gibi daha eksiksiz örnekler için bkz. the Haskell port of the NEHE tutorials. C bağlamaları gibi daha fazla olan RAW OpenGL bağlarını kullanırlar.

+0

Bu, yapmaya çalıştığım şey için işe yarayacak gibi görünüyor, ancak işe yaramaz gibi görünmüyor. Program derlenecek, ancak çalıştırdığımda hiçbir çizgi çizilmiyor. Belki doğru yapmıyorum ya da yanlış yere koydum. Yine, ben opengl için yeni ve gerçekten nasıl çalıştığını bilmiyorum. Bana daha fazla tam bir program (yeni başlayanların anlayacağı bir şey) olarak verebilmenin herhangi bir yolu var mı? – lewdsterthumbs

+0

Tamam, bilgisayarımda çalışan tam bir örnek program ekledim. – dflemstr

+2

@lewdsterthumbs [Boş bir siyah ekran elde etmek için 40 yolun tadını çıkarabilirsiniz] (http://dmalcolm.livejournal.com/2433.html). –

1

Hızlı google bu kadar açık Orijinal OpenGL belgelerini olduğu gibi kullanabilecektir; Bundan sonra, Haskell bağlamalarına girmek ve Haskell'de aynı OpenGL çağrılarını nasıl kullandığınızı görmek isteyebilirsiniz.

+0

Daha önce buna baktım. Bolca resim var, ama nasıl bir şey yapılacağını açıklamıyor. – lewdsterthumbs

+2

Yapıyor, ama hemen belli değil. – tdammers