Why is this not working? It's not drawing with glDrawElements
SuperStrict
'Framework BRL.Basic
Import BRL.Timer
'Import BRL.GLGraphics
Import Pub.OpenGL
Import Pub.Glew
Const GWIDTH:Int = 1024
Const GHEIGHT:Int = 768
InitGL()
Local Shader:TShader = New TShader.Create(VERTEX_CODE, FRAGMENT_CODE)
Local Timer:TTimer = CreateTimer(60), Frame:Int
Const VERTEX_INDX:Int = 0
Local vertices:Float[] = [0.5, 0.5, -0.5, ..
- 0.5, 0.5, -0.5, ..
- 0.5, -0.5, -0.5, ..
0.5, -0.5, -0.5, ..
0.5, -0.5, 0.5, ..
0.5, 0.5, 0.5, ..
- 0.5, 0.5, 0.5, ..
- 0.5, -0.5, 0.5]
Local indices:Int[] = [0, 1, 2, 0, 2, 3, ..
0, 3, 4, 0, 4, 5, ..
0, 5, 6, 0, 6, 1, ..
7, 6, 1, 7, 1, 2, ..
7, 4, 5, 7, 5, 6, ..
7, 2, 3, 7, 3, 4]
While Not (KeyHit(KEY_ESCAPE) Or AppTerminate())
glClear(GL_COLOR_BUFFER_BIT)
Local T:Float = Sin(Frame)
Local RealMin:Float = Blend(-4, -1, T)
Local RealMax:Float = Blend( 4, -0, T)
Local ImaginaryMin:Float = Blend(-3, -1, T)
Local ImaginaryMax:Float = Blend(3, -0.25, T)
' verticesPtr[0]:+0.01
' verticesPtr[1]:+0.01
' verticesPtr[2]:+0.01
' verticesPtr[3]:+0.01
' verticesPtr[4]:+0.01
' verticesPtr[5]:+0.01
' verticesPtr[6]:+0.01
' verticesPtr[7]:+0.01
' verticesPtr[8]:+0.01
Shader.Enable()
' glBegin(GL_QUADS)
' glTexCoord2f(RealMin, ImaginaryMin); glVertex2f(0, 0 )
' glTexCoord2f(RealMax, ImaginaryMin); glVertex2f(GWIDTH, 0 )
' glTexCoord2f(RealMax, ImaginaryMax); glVertex2f(GWIDTH, GHEIGHT)
' glTexCoord2f(RealMin, ImaginaryMax); glVertex2f(0, GHEIGHT)
' glEnd()
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices)
glDrawElements(GL_TRIANGLES, SizeOf(indices), GL_UNSIGNED_BYTE, indices)
Shader.Disable()
Frame :+ 1
Flip(0)
WaitTimer(Timer)
Wend
End
Const VERTEX_CODE:String = ..
"attribute vec4 vPosition;~n" + ..
"void main( void ) {~n" + ..
"gl_Position = vPosition;~n" + ..
"}"
Const FRAGMENT_CODE:String = ..
"precision mediump float;~n" + ..
"void main(void) {~n" + ..
"gl_FragColor = vec4(1.0,0.0,0.0,1.0);~n" + ..
"}"
Function Blend:Float(A:Float, B:Float, T:Float)
Return A*(1 - T) + B*T
End Function
Function InitGL()
GLGraphics GWIDTH, GHEIGHT
glewInit()
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, GWIDTH, GHEIGHT, 0, -1, 1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
If Not TShader.CheckCompability() Then Notify("Shader support not available", True); End
End Function
Type TShader
Field ProgramObject:Int
Method Load:TShader(VertexPath:String, FragmentPath:String)
Local VertexCode:String, FragmentCode:String
Try
VertexCode = LoadText(VertexPath)
FragmentCode = LoadText(FragmentPath)
Catch Dummy:Object
Return Null
EndTry
Create(VertexCode, FragmentCode)
Return Self
End Method
Method Create:TShader(VertexCode:String, FragmentCode:String)
If Not ProgramObject Then ProgramObject = glCreateProgram()
Local VertexShader :Int = glCreateShader(GL_VERTEX_SHADER)
Local FragmentShader:Int = glCreateShader(GL_FRAGMENT_SHADER)
Local ErrorMessage:String
_LoadShader(VertexCode, VertexShader)
glCompileShader(VertexShader)
If _CheckForErrors(VertexShader, ErrorMessage) Then
glDeleteShader(VertexShader)
Throw ErrorMessage
EndIf
_LoadShader(FragmentCode, FragmentShader)
glCompileShader(FragmentShader)
If _CheckForErrors(FragmentShader, ErrorMessage) Then
glDeleteShader(VertexShader)
glDeleteShader(FragmentShader)
Throw ErrorMessage
EndIf
glAttachShader(ProgramObject, VertexShader)
glAttachShader(ProgramObject, FragmentShader)
'glBindAttribLocation(ProgramObject, 0, "vPosition") ;
glDeleteShader(VertexShader)
glDeleteShader(FragmentShader)
glLinkProgram(ProgramObject)
If _CheckForErrors(ProgramObject, ErrorMessage, False) Then Throw ErrorMessage
' glValidateProgram(ProgramObject)
Return Self
End Method
Method Enable()
glUseProgram(ProgramObject)
End Method
Method Disable()
glUseProgram(0)
End Method
Method GetUniformLocation:Int(Name:String)
Return glGetUniformLocation(ProgramObject, Name)
End Method
Method Delete()
glDeleteObjectARB(ProgramObject)
End Method
Function _LoadShader(ShaderCode:String, ShaderObject:Int)
Local ShaderCodeC:Byte Ptr = ShaderCode.ToCString()
Local ShaderCodeLen:Int = ShaderCode.Length
glShaderSource(ShaderObject, 1, Varptr ShaderCodeC, Varptr ShaderCodeLen)
MemFree(ShaderCodeC)
End Function
Function _CheckForErrors:Int(ShaderObject:Int, ErrorString:String Var, Compiled:Int = True)
Local Successful:Int
If Compiled Then
glGetShaderiv(ShaderObject, GL_COMPILE_STATUS, Varptr Successful)
Else
glGetProgramiv(ShaderObject, GL_LINK_STATUS, Varptr Successful)
EndIf
If Not Successful Then
Local ErrorLength:Int
'glGetObjectParameterivARB(ShaderObject, GL_OBJECT_INFO_LOG_LENGTH_ARB, Varptr ErrorLength)
glGetShaderiv(ShaderObject,GL_INFO_LOG_LENGTH,Varptr ErrorLength)
Local Message:Byte Ptr = MemAlloc(ErrorLength), Dummy:Int
glGetInfoLogARB(ShaderObject, ErrorLength, Varptr Dummy, Message)
ErrorString = String.FromCString(Message)
MemFree(Message)
Return -1
EndIf
Return 0
End Function
Function CheckCompability:Int()
Local Extensions:String = String.FromCString(Byte Ptr glGetString(GL_EXTENSIONS))
Local GLVersion:String = String.FromCString(Byte Ptr glGetString(GL_VERSION))
Local GLVersionInt:Int = GLVersion[.. 3].Replace(".", "").ToInt()
If Extensions.Find("GL_ARB_shader_objects" ) >= 0 And ..
Extensions.Find("GL_ARB_vertex_shader" ) >= 0 And ..
Extensions.Find("GL_ARB_fragment_shader") >= 0 Or GLVersionInt >= 20 Then Return True
Return False
End Function
End Type
|