Теперь рендеринг хорош: -)
Я не знаю, что вызвало проблему, потому что я сделал множество изменений ...Вот соответствующие части кода:
resize :: Double -> Size -> IO ()
resize zoom s@(Size w h) = do
viewport $= (Position 0 0, s)
matrixMode $= Projection
loadIdentity
perspective 45.0 (w'/h') 1.0 100.0
lookAt (Vertex3 0 0 (-6+zoom)) (Vertex3 0 0 0) (Vector3 0 1 0)
matrixMode $= Modelview 0
where
w' = realToFrac w
h' = realToFrac h
main :: IO ()
main = do
_ <- getArgsAndInitialize
_ <- createWindow "Barth Sextic"
windowSize $= Size 500 500
initialDisplayMode $= [RGBMode, DoubleBuffered, WithDepthBuffer]
clearColor $= discord
clientState ColorArray $= Disabled -- this is a default option, I think
materialAmbient Front $= black
materialDiffuse Front $= white
materialEmission Front $= Color4 0 0 0 0
materialSpecular Front $= white
materialShininess Front $= 50
lighting $= Enabled
light (Light 0) $= Enabled
position (Light 0) $= Vertex4 500 500 (-1000) 1
diffuse (Light 0) $= white
specular (Light 0) $= white
lightModelAmbient $= Color4 0.35 0.35 0.35 1
depthMask $= Enabled -- this is default option
depthFunc $= Just Lequal
shadeModel $= Smooth
fog $= Disabled -- this is default option, I think
polygonMode $= (Fill, Fill) -- this is default option
polygonSmooth $= Enabled
cullFace $= Just Front
rescaleNormal $= Enabled
......
Я также изменил порядок вершин каждого треугольника:
drawTriangle ((v1,v2,v3), (n1,n2,n3)) = do
materialDiffuse Front $= fuchsia
normal n1
vertex v1
normal n3
vertex v3
normal n2
vertex v2
Этот ответ являетсянемного преждевременноЯ буду расследовать позже, и я отредактирую, чтобы написать свои выводы.
РЕДАКТИРОВАТЬ
Что ж, я провел дальнейшие исследования, и, к сожалению, я пришел к выводу, что у меня нет никаких объяснений: у меня естьотменил все мои изменения и не смог воспроизвести проблему !!
Теперь я использую этот более короткий код:
display :: ...... -> displayCallback
......
renderPrimitive Triangles $
mapM_ drawTriangle triangles
swapBuffers
where
drawTriangle ((v1,v2,v3), (n1,n2,n3)) = do
materialDiffuse Front $= fuchsia
normal n1
vertex v1
normal n2
vertex v2
normal n3
vertex v3
resize :: Double -> Size -> IO ()
resize zoom s@(Size w h) = do
viewport $= (Position 0 0, s)
matrixMode $= Projection
loadIdentity
perspective 45.0 (w'/h') 1.0 100.0
lookAt (Vertex3 0 0 (-6+zoom)) (Vertex3 0 0 0) (Vector3 0 1 0)
matrixMode $= Modelview 0
where
w' = realToFrac w
h' = realToFrac h
Два MatrixMode
важны.
main :: IO ()
main = do
_ <- getArgsAndInitialize
_ <- createWindow "Barth Sextic"
windowSize $= Size 500 500
initialDisplayMode $= [RGBMode, DoubleBuffered, WithDepthBuffer]
clearColor $= discord
materialAmbient Front $= black
materialDiffuse Front $= white
materialEmission Front $= black
lighting $= Enabled
light (Light 0) $= Enabled
position (Light 0) $= Vertex4 500 500 (-1000) 1
ambient (Light 0) $= white
diffuse (Light 0) $= white
specular (Light 0) $= white
depthFunc $= Just Less
shadeModel $= Smooth
cullFace $= Just Back
......
polygonSmooth
и rescaleNormal
были бесполезны.Я также изменил положение света, но это не та причина, которая вызвала проблему.cullFace
не является необходимым, но это хорошо, потому что нет видимой задней поверхности.