1
$\begingroup$

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?

$\endgroup$
1

0

You must log in to answer this question.

Browse other questions tagged .