glDrawElements

BlitzMax Forums/OpenGL Module/glDrawElements

BLaBZ(Posted 2012) [#1]
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




Bobysait(Posted 2012) [#2]
you're using an unset flat view (glortho)
you're using GL_UNISGNED_BYTE and SizeOf(indices) for Int Ptr (GL_INT)

I didn't test it, but it's a start