LINUX.ORG.RU

openGL неправильный порядок рисования

 ,


1

2

Здравствуйте, у меня такая проблема: я рисую 4 стороны кубика, и при любом повороте, поверх всех сторон рисуется не та сторона, которая по координатам впереди всех, а та, которая по коду рисовалась последней. вот код:

import Graphics.UI.GLUT as GLUT
import Data.Maybe
import Data.IORef

type F = GLfloat


main = do
	getArgsAndInitialize
	win <- createWindow "Main Window"
	st <- newIORef (0,0)
	displayCallback $= onDraw st
	keyboardMouseCallback $= Just (onKey st)
	mainLoop

onDraw st = do
	clear [ColorBuffer,DepthBuffer]
	loadIdentity
	(x,y) <- readIORef st
	rot x 1 0 0
	rot y 0 1 0 
	scale (0.1 :: F) 0.1 0.1
	kub
	flush

onKey :: IORef (F,F) -> Key -> KeyState -> Modifiers -> Position -> IO ()
onKey v (SpecialKey k) Down _ _ = case k of
								{
									KeyLeft	-> modifyIORef v (\(x,y) -> (x,y+1));
									KeyRight-> modifyIORef v (\(x,y) -> (x,y-1));
									KeyUp	-> modifyIORef v (\(x,y) -> (x-1,y));
									KeyDown -> modifyIORef v (\(x,y) -> (x+1,y));
									_		-> return()
								} >> postRedisplay Nothing
onKey _ _ _ _ _ = return()

kub = do
	cl 1 1 1
	preservingMatrix $ trn 0 0 (-1) >> sq
	cl 1 0.5 0.5
	preservingMatrix $ trn 0 0 1 >> sq
	cl 0.5 0.5 1
	preservingMatrix $ rot 90 0 1 0 >> trn 0 0 1 >> sq >> cl 0.5 0.5 0.5 >> trn 0 0 (-2) >> sq
	

cl,trn :: F -> F -> F -> IO()
cl r g b = color (Color3 r g b)

trn x y z = translate$ Vector3 x y z

rot :: F -> F -> F -> F -> IO()
rot a x y z = rotate a $ Vector3 x y z

sq = renderPrimitive Polygon$ mapM_ vertex [Vertex3 (-1 :: F) (-1) 0, Vertex3 (-1) 1 0, Vertex3 1 1 0, Vertex3 1 (-1) 0] 

★★★★★

разрешить и поставить правильные глубинные(depth) тесты и очищать depth буфер перед рисованием

Bad_ptr ★★★★★
()
import Graphics.UI.GLUT as GLUT

Выкидывай сразу. Говно на палочке, которое умеет чуть менее, чем ничего. Возьми SDL или сразу Xlib/WINAPI.

resurtm ★★★
()
Ответ на: комментарий от Aswed

А где у тебя там устанавливаются следующие OpenGL-значения:

glClearDepth = 1.0
glDepthFunc = GL_LESS
glEnable = GL_DEPTH_TEST

Это обязательно, чтобы depth buffer заработал.

resurtm ★★★
()
Ответ на: комментарий от Aswed

Ещё погугли по поводу того, что GLUT должен создавать правильный display mode (с GLUT_DEPTH битом). ХЗ как в биндинге для Хаскеля это будет.

resurtm ★★★
()
Ответ на: комментарий от resurtm

или сразу Xlib/WINAPI

О, разумеется, это куда лучше чем SDL.

buddhist ★★★★★
()

Разве ж это проблема. Рисуй психоделичные анимации!

unC0Rr ★★★★★
()
Ответ на: комментарий от resurtm

Слишком самонадеянный комметарий.
Для той стадии, в которой находится ТС GLUT как раз самое оно.

trex6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.