I'm learning opengl in blender and successfully drew a triangle in 3d viewport. Now I'm trying to draw a rectangle using Element Object. Here is what I've tried. But it draws nothing.
from bgl import *
import bpy
from sys import getsizeof
vertexShaderSource = """
#version 330
layout(location = 0) in vec3 position;
void main()
{
gl_Position = vec4(position,1.0);
}
"""
fragmentShaderSource = """
#version 330
out vec4 outputColor;
void main(){
outputColor = vec4(1.0f, 0.5f, 0.2f, 1.0);
}
"""
vertices = [0.5 , 0.5 , 0.0,
0.5, -0.5 , 0.0,
-0.5, -0.5 , 0.0,
-0.5, 0.5, 0.0]
indices = [0,1,3,
1,2,3]
vertexPositions_ptr = Buffer(GL_FLOAT,len(vertices),vertices)
indices_ptr = Buffer(GL_INT, len(indices),indices)
VBO = Buffer(GL_INT,1)
VAO = Buffer(GL_INT,1)
EBO = Buffer(GL_INT,1)
glGenVertexArrays(1,VAO)
glGenBuffers(1, VBO)
glGenBuffers(1, EBO)
# Shader compilation
vertexShader = glCreateShader(GL_VERTEX_SHADER)
glShaderSource(vertexShader, vertexShaderSource)
glCompileShader(vertexShader)
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)
glShaderSource(fragmentShader, fragmentShaderSource)
glCompileShader(fragmentShader)
shaderProgram = glCreateProgram()
glAttachShader(shaderProgram, vertexShader)
glAttachShader(shaderProgram, fragmentShader)
glLinkProgram(shaderProgram)
glDetachShader(shaderProgram, vertexShader);
glDetachShader(shaderProgram, fragmentShader);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glBindVertexArray(VAO[0])
glBindBuffer(GL_ARRAY_BUFFER, VBO[0])
glBufferData(GL_ARRAY_BUFFER, getsizeof(vertexPositions_ptr), vertexPositions_ptr, GL_STATIC_DRAW)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO[0])
glBufferData(GL_ELEMENT_ARRAY_BUFFER, getsizeof(indices_ptr), indices_ptr, GL_STATIC_DRAW)
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,None)
glBindBuffer(GL_ARRAY_BUFFER, 0)
glBindVertexArray(0)
draw_handle = None
# Draw
def draw():
glUseProgram(shaderProgram)
glBindVertexArray(VAO[0])
glDrawElements(GL_TRIANGLES,len(indices),GL_UNSIGNED_INT, None)
glBindVertexArray(0)
glUseProgram(0)
# Clear
def in_3_sec():
bpy.types.SpaceView3D.draw_handler_remove(draw_handle,'WINDOW')
glDeleteVertexArrays(1,VAO)
glDeleteBuffers(1,VBO)
glDeleteBuffers(1,EBO)
glDeleteProgram(shaderProgram)
draw_handle = bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW')
bpy.app.timers.register(in_3_sec, first_interval=3)
What am I doing wrong here?