我被困在使用Haskell獲取多個紋理在OpenGL中工作。我一直在網上關注NeHe Tuts和一些其他各種OpenGL資源,但稍微不同的調用和我的新手的組合已經造成了障礙。如何使用Haskell更改OpenGL中的紋理
具體而言,我想渲染兩個立方體,每個立方體都具有不同的紋理(暫時所有6個面都具有相同的紋理)。渲染一個立方體,紋理很好。渲染相同紋理的多個立方體也可以很好地工作。但我沒能弄清楚如何更改兩個立方體
紋理如果我沒有記錯的電話改變紋理是:
textureBinding $ Texture2D $= Just *mytexture*
其中mytexture應該是某種形式的textureID(一個TextureObject)。 什麼進入mytexture現貨?這應該很容易,但我花了2天的更好的一部分試圖找出這個無濟於事。任何幫助表示讚賞。
主營:
-- imports --
import Graphics.Rendering.OpenGL
import Graphics.UI.GLUT
import Data.IORef
import Display
import Bindings
import Control.Monad
import Textures
-- main --
main = do
(program, _) <- getArgsAndInitialize -- convenience, return program name and non-GLUT commands
initialDisplayMode $= [DoubleBuffered, WithDepthBuffer] -- inital display mode
initialWindowSize $= Size 600 600
createWindow "OpenGL Basics"
reshapeCallback $= Just reshape
angle <- newIORef (0.1::GLfloat) -- linked to angle of rotation (speed?)
delta <- newIORef (0.1::GLfloat)
position <- newIORef (0.0::GLfloat, 0.0) -- position, pass to display
texture Texture2D $= Enabled
tex <- getAndCreateTextures ["goldblock","pumpkintop"]
keyboardMouseCallback $= Just (keyboardMouse delta position) --require keys, delta, and position
idleCallback $= Just (idle angle delta) --ref idle angle and delta
displayCallback $= (display angle position tex) --ref display angle and delta
cullFace $= Just Front
mainLoop -- runs forever until a hard exit is called
在主要我打電話getAndCreateTextures(從網上借),返回紋理對象的列表。
顯示(用於渲染):
-- display (main) --
display angle position tex = do
clear [ColorBuffer, DepthBuffer]
loadIdentity --modelview
shadeModel $= Smooth
(x,z) <- get position --get current position from init or keys
translate $ Vector3 x 0 z -- move to the position before drawing stuff
-- DO STUFF HERE
-- texture $ Texture2D $= Just wtfgoeshere
preservingMatrix $ do
a <- get angle
rotate a $ Vector3 (1::GLfloat) 0 0
-- rotate a $ Vector3 0 0 (1::GLfloat)
rotate a $ Vector3 0 (1::GLfloat) 0
-- scale 0.7 0.7 (0.7::GLfloat)
-- color $ Color3 (0.5::GLfloat) (0.1::GLfloat) (0.1::GLfloat)
cubeTexture (0.1::GLfloat)
swapBuffers
--idle (main)
idle angle delta = do
a <- get angle -- get existing angle
d <- get delta -- get delta
angle $= a + d -- new angle is old angle plus plus delta
postRedisplay Nothing
丁丁丁!這允許我加載多個紋理並將它們傳遞給渲染部分。接下來的想法,隨着紋理列表的增長,在當前的設置中,我必須傳遞每個紋理才能夠調用它們。爲了簡化多個紋理的傳遞,我只需在一個單獨的區域中調用getAndCreateTextures並將大量紋理作爲一個變量返回,是正確的? – llanoraw 2011-04-21 17:57:57
@llanoraw通常你會分開加載紋理和它們的用法。您可能能夠在啓動時加載所有紋理,或者您可能希望基於當前可見的場景一次加載幾個紋理。您可能想考慮將幾何與配對中的必要'TextureObject'配對,然後渲染該記錄。 – Anthony 2011-04-21 20:12:59