wrote some render-functions and shaders
- rudimentary vertex and fragment-shader in shaders/.. - created new Render-Module (unfinished and untested)
This commit is contained in:
		
							
								
								
									
										52
									
								
								src/Render/Render.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/Render/Render.hs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| {-# LANGUAGE BangPatterns #-} | ||||
| module Render.Render where | ||||
|  | ||||
| import Graphics.Rendering.OpenGL.GL.BufferObjects | ||||
| import Graphics.Rendering.OpenGL.GL.ObjectName | ||||
| import Graphics.Rendering.OpenGL.GL.StateVar | ||||
| import Render.Misc | ||||
| import Graphics.Rendering.OpenGL.Raw.Core31.Types (GLfloat) | ||||
| import Foreign.Storable (sizeOf) | ||||
| import Foreign.Marshal.Array (withArray) | ||||
| import Graphics.Rendering.OpenGL.GL.VertexSpec | ||||
| import Graphics.Rendering.OpenGL.GL.Shaders | ||||
| import Graphics.Rendering.OpenGL.GL.VertexArrays (Capability(..), vertexAttribArray) | ||||
| import qualified Data.ByteString as B | ||||
|  | ||||
| vertexShaderFile :: String | ||||
| vertexShaderFile = "shaders/vertex.shader" | ||||
| fragmentShaderFile :: String | ||||
| fragmentShaderFile = "shaders/fragment.shader" | ||||
|  | ||||
| initBuffer :: [GLfloat] -> IO BufferObject | ||||
| initBuffer varray =  | ||||
|         let | ||||
|                 sizeOfVarray = length varray * sizeOfComponent | ||||
|                 sizeOfComponent = sizeOf (head varray) | ||||
|         in do | ||||
|            bufferObject <- genObjectName | ||||
|            bindBuffer ArrayBuffer $= Just bufferObject | ||||
|            withArray varray $ \buffer -> | ||||
|               bufferData ArrayBuffer $= (fromIntegral sizeOfVarray, buffer, StaticDraw) | ||||
|            checkError "initBuffer" | ||||
|            return bufferObject | ||||
|  | ||||
| initShader :: IO (UniformLocation, AttribLocation, AttribLocation) | ||||
| initShader = do | ||||
|    ! vertexSource <- B.readFile vertexShaderFile | ||||
|    ! fragmentSource <- B.readFile fragmentShaderFile | ||||
|    vertexShader <- compileShaderSource VertexShader vertexSource | ||||
|    fragmentShader <- compileShaderSource FragmentShader fragmentSource | ||||
|    program <- createProgramUsing [vertexShader, fragmentShader] | ||||
|    currentProgram $= Just program | ||||
|  | ||||
|    projectionMatrixIndex <- get (uniformLocation program "fg_ProjectionMatrix") | ||||
|  | ||||
|    colorIndex <- get (attribLocation program "fg_Color") | ||||
|    vertexAttribArray colorIndex $= Enabled | ||||
|  | ||||
|    vertexIndex <- get (attribLocation program "fg_Vertex") | ||||
|    vertexAttribArray vertexIndex $= Enabled | ||||
|  | ||||
|    checkError "initShader" | ||||
|    return (projectionMatrixIndex, colorIndex, vertexIndex) | ||||
		Reference in New Issue
	
	Block a user