val (angle, theta) = (ref 0.0, ref 0.5) // cube ÀÇ material property val mdi = Array.of_list [1.0,1.0,1.0,1.0] // diffuse val mam = Array.of_list [1.0,1.0,1.0,1.0] // ambient val msp = Array.of_list [1.0,1.0,1.0,1.0] // specular val msh = 128.0 // shininess : specular exponent val (tex1, tex2) = (ref 0, ref 0) // cube ¿¡ ÀÔÈú 2D texture µéÀ» ºÎ¸£´Â display list ¸¦ ¸¸µç´Ù. val loadtextures = fn () => let val image1 = // 8 x 8 image "\ XXXX0000XXXX0000000000000000aaaa\ 0000XXXX0000XXXX0000aaaaaaaaaaaa\ 00000000XXXX0000XXXXaaaa00000000\ 000000000000XXXXaaaaXXXX00000000\ 00000000aaaaaaaaXXXX0000XXXX0000\ 00000000aaaa00000000XXXX0000XXXX\ aaaaaaaaaaaa000000000000XXXX0000\ aaaa000000000000000000000000XXXX\ " val image2 = // 8 x 8 image "\ XXXX\127\000\127\000XXXX\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000aaaa\ XXXX\127\000\127\000XXXX\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\ \127\000\127\000\127\000\127\000XXXX\127\000\127\000XXXXaaaa\127\000\127\000\127\000\127\000\ \127\000\127\000\127\000\127\000\127\000\127\000XXXXaaaaXXXX\127\000\127\000\127\000\127\000\ \127\000\127\000\127\000\127\000aaaaaaaaXXXX^^^^XXXX^^^^\ \127\000\127\000\127\000\127\000aaaa\127\000\127\000\127\000\127\000XXXX^^^^XXXX\ aaaaaaaaaaaa\127\000\127\000\127\000\127\000\127\000\127\000XXXX\127\000\127\000\ aaaa\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000XXXX\ " in Gl.newList !tex1 Gl.COMPILE ; Gl.disable (Gl.TEX Gl.TEXTURE_2D) ; Gl.pixelStorei Gl.UNPACK_ALIGNMENT 4 ; Gl.pixelStorei Gl.UNPACK_ROW_LENGTH 0 ; Gl.pixelStorei Gl.UNPACK_SKIP_ROWS 0 ; Gl.pixelStorei Gl.UNPACK_SKIP_PIXELS 0 ; Gl.texParameter Gl.TEXTURE_2D (Gl.WRAP_S Gl.REPEAT) ; Gl.texParameter Gl.TEXTURE_2D (Gl.WRAP_T Gl.REPEAT) ; Gl.texParameter Gl.TEXTURE_2D (Gl.MAG_FILTER Gl.LINEAR) ; Gl.texParameter Gl.TEXTURE_2D (Gl.MIN_FILTER Gl.LINEAR) ; Gl.texImage2D Gl.TEXTURE_2D 0 4 8 8 0 Gl.RGB (Gl.PT Gl.UNSIGNED_BYTE) image1 ; Gl.enable (Gl.TEX Gl.TEXTURE_2D) ; Gl.endList () ; Gl.newList !tex2 Gl.COMPILE ; Gl.disable (Gl.TEX Gl.TEXTURE_2D) ; Gl.pixelStorei Gl.UNPACK_ALIGNMENT 4 ; Gl.pixelStorei Gl.UNPACK_ROW_LENGTH 0 ; Gl.pixelStorei Gl.UNPACK_SKIP_ROWS 0 ; Gl.pixelStorei Gl.UNPACK_SKIP_PIXELS 0 ; Gl.texParameter Gl.TEXTURE_2D (Gl.WRAP_S Gl.REPEAT) ; Gl.texParameter Gl.TEXTURE_2D (Gl.WRAP_T Gl.REPEAT) ; Gl.texParameter Gl.TEXTURE_2D (Gl.MAG_FILTER Gl.LINEAR) ; Gl.texParameter Gl.TEXTURE_2D (Gl.MIN_FILTER Gl.LINEAR) ; Gl.texImage2D Gl.TEXTURE_2D 0 4 8 8 0 Gl.RGB (Gl.PT Gl.UNSIGNED_BYTE) image2 ; Gl.enable (Gl.TEX Gl.TEXTURE_2D) ; Gl.endList () end val display = fn () => // È­¸é Áö¿ì±â Gl.clearColor 0.0 0.0 0.0 1.0 ; Gl.clear [Gl.COLOR_BUFFER_BIT,Gl.DEPTH_BUFFER_BIT] ; // orthographic projection À¸·Î clipping volume À» Á¤ÇÔ Gl.matrixMode Gl.PROJECTION ; Gl.loadIdentity () ; Gl.ortho 0.0 300.0 0.0 300.0 300.0 (-300.0) ; // ȸÀüº¯È¯ Gl.matrixMode Gl.MODELVIEW ; Gl.loadIdentity () ; Gl.translate 150.0 150.0 0.0 ; Gl.rotate !angle 0.0 1.0 1.0 ; Gl.rotate !angle 1.0 0.0 1.0 ; Gl.rotate !angle 1.0 1.0 0.0 ; // ¹°Áú¼Ó¼º ¼³Á¤ Gl.materialfv Gl.F_FRONT_AND_BACK Gl.M_AMBIENT mam ; Gl.materialfv Gl.F_FRONT_AND_BACK Gl.M_DIFFUSE mdi ; Gl.materialfv Gl.F_FRONT_AND_BACK Gl.M_SPECULAR msp ; Gl.materialf Gl.F_FRONT_AND_BACK Gl.SHININESS msh ; // cube ±×¸² let val s = 75.0 in Gl.callList !tex1 ; Gl.glbegin Gl.QUADS ; Gl.normal3 1.0 0.0 0.0 ; Gl.texCoord2 0.0 0.0 ; Gl.vertex3 s s s ; Gl.texCoord2 1.0 0.0 ; Gl.vertex3 s (-s) s ; Gl.texCoord2 0.0 1.0 ; Gl.vertex3 s (-s) (-s) ; Gl.texCoord2 1.0 1.0 ; Gl.vertex3 s s (-s) ; Gl.normal3 0.0 1.0 0.0 ; Gl.texCoord2 1.0 1.0 ; Gl.vertex3 s s s ; Gl.texCoord2 0.0 1.0 ; Gl.vertex3 s s (-s) ; Gl.texCoord2 1.0 0.0 ; Gl.vertex3 (-s) s (-s) ; Gl.texCoord2 0.0 0.0 ; Gl.vertex3 (-s) s s ; Gl.normal3 0.0 0.0 1.0 ; Gl.texCoord2 1.0 0.0 ; Gl.vertex3 s s s ; Gl.texCoord2 0.0 1.0 ; Gl.vertex3 (-s) s s ; Gl.texCoord2 1.0 1.0 ; Gl.vertex3 (-s) (-s) s ; Gl.texCoord2 0.0 0.0 ; Gl.vertex3 s (-s) s ; Gl.glend () ; Gl.callList !tex2 ; Gl.glbegin Gl.QUADS ; Gl.normal3 (-1.0) 0.0 0.0 ; Gl.texCoord2 0.0 0.0 ; Gl.vertex3 (-s) (-s) (-s) ; Gl.texCoord2 1.0 0.0 ; Gl.vertex3 (-s) (-s) s ; Gl.texCoord2 0.0 1.0 ; Gl.vertex3 (-s) s s ; Gl.texCoord2 1.0 1.0 ; Gl.vertex3 (-s) s (-s) ; Gl.normal3 0.0 (-1.0) 0.0 ; Gl.texCoord2 1.0 1.0 ; Gl.vertex3 (-s) (-s) (-s) ; Gl.texCoord2 0.0 1.0 ; Gl.vertex3 s (-s) (-s) ; Gl.texCoord2 1.0 0.0 ; Gl.vertex3 s (-s) s ; Gl.texCoord2 0.0 0.0 ; Gl.vertex3 (-s) (-s) s ; Gl.normal3 0.0 0.0 (-1.0) ; Gl.texCoord2 1.0 0.0 ; Gl.vertex3 (-s) (-s) (-s) ; Gl.texCoord2 0.0 1.0 ; Gl.vertex3 (-s) s (-s) ; Gl.texCoord2 1.0 1.0 ; Gl.vertex3 s s (-s) ; Gl.texCoord2 0.0 0.0 ; Gl.vertex3 s (-s) (-s) ; Gl.glend () end ; // À§¿Í °°Àº ¸ðµç °ÍÀ» ¼öÇàÇÏ°í front ¿Í back buffer ¸¦ ¹Ù²ã È­¸é update Gl.flush () ; Glut.swapBuffers () ; // !theta µµ¸¸Å­ ȸÀü½ÃŲ´Ù. if !angle < 359.0 then angle += !theta else angle := 0.0 val initlight = fn () => // ºûÀ» ÃʱâÈ­ÇÑ´Ù. let val pos = Array.of_list [15.0,30.0,-45.0,0.0] // position val spe = Array.of_list [1.0,1.0,1.0,1.0] // specular val dif = Array.of_list [1.0,1.0,1.0,1.0] // diffuse in Gl.shadeModel Gl.FLAT ; Gl.lightfv Gl.LIGHT0 Gl.POSITION pos ; Gl.lightfv Gl.LIGHT0 Gl.L_DIFFUSE dif ; Gl.lightfv Gl.LIGHT0 Gl.L_SPECULAR spe ; Gl.enable Gl.LIGHTING ; Gl.enable (Gl.LIGHT Gl.LIGHT0) ; Gl.enable Gl.DEPTH_TEST end val mouseexit = fn _ _ _ _ => // °ÔÀÓ¸ðµå¿¡¼­ ¸¶¿ì½º Ŭ¸¯Çϸé â¸ðµå·Î ¹Ù²Û´Ù. Glut.leaveGameMode () ; theta := 0.2 ; Glut.initDisplayMode [Glut.RGBA,Glut.DOUBLE] ; Glut.initWindowSize 450 480 ; Glut.initWindowPosition 105 0 ; Glut.createWindow "Hello GLUT!" ; initlight () ; loadtextures () ; Glut.displayFunc display ; Glut.idleFunc display val _ = // main procedure ; give any command line option to see game mode Glut.init Sys.argv ; Glut.initDisplayMode [Glut.RGBA,Glut.DOUBLE] ; if Array.length Sys.argv > 1 then Glut.enterGameMode () else ( Glut.initWindowSize 450 480 ; Glut.initWindowPosition 105 0 ; Glut.createWindow "Hello GLUT!" ; 0 ) ; initlight () ; tex1 := Gl.genLists 1 ; tex2 := Gl.genLists 1 ; loadtextures () ; Glut.displayFunc display ; Glut.idleFunc display ; if Array.length Sys.argv > 1 then Glut.mouseFunc mouseexit else theta:=0.2 ; Glut.mainLoop ()