Skip to main content

PyOpenGL 4.5

Import

from OpenGL.GL import *

OpenGL context

Framebuffer

fbo = np.empty(1, dtype=np.uint32)
glCreateFramebuffers(len(fbo), fbo)

glNamedFramebufferTexture(fbo, attachment, attachement_id, level)

glNamedFramebufferRenderbuffer(fbo, attachment, GL_RENDERBUFFER, attachement_id)

# attachment:
# GL_COLOR_ATTACHMENT{i}
# GL_DEPTH_ATTACHMENT
# GL_STENCIL_ATTACHMENT
# GL_DEPTH_STENCIL_ATTACHMENT

glNamedFramebufferDrawBuffers(fbo, 2, np.array( (GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1),dtype=np.uint32 ) )

Buffers

vertices = <numpy array>

buf = np.empty(1, dtype=np.uint32)
glCreateBuffers(len(buf), buf)
# code = 0 if not dynamic else GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT| GL_MAP_PERSISTENT_BIT
glNamedBufferStorage(buf, vertices.nbytes, vertices, code)


glBindBuffer(<type> ,buf)
# GL_ELEMENT_ARRAY_BUFFER
# GL_DRAW_INDIRECT_BUFFER
# GL_SHADER_STORAGE_BUFFER

VAO

vao = np.empty(1, dtype=np.uint32)
glCreateVertexArrays(len(vao), vao)

glVertexArrayAttribFormat(vao, attribindex, size, attribtype, normalized, relativeoffset)
glVertexArrayAttribBinding(vao, attribindex, i)
glEnableVertexArrayAttrib(vao, attribindex)

glVertexArrayVertexBuffer(vao, i, vbo, offset, stride)

glVertexArrayElementBuffer(vao, ebo_id)

glBindVertexArray(vao)

Shader

program = glCreateProgram()

shader = glCreateShader(<shader_type>)
# GL_VERTEX_SHADER
# GL_TESS_CONTROL_SHADER
# GL_TESS_EVALUATION_SHADER
# GL_GEOMETRY_SHADER
# GL_FRAGMENT_SHADER
# GL_COMPUTE_SHADER

glShaderSource(shader, shader_code)
glCompileShader(shader)

if not glGetShaderiv(shader, GL_COMPILE_STATUS):
print glGetShaderInfoLog(shader)

glAttachShader(program, shader)

glLinkProgram(program)
if not glGetProgramiv(program, GL_LINK_STATUS):
print glGetProgramInfoLog(program)

glDeleteShader(shader)

glUseProgram(program)

Texture

tex = np.empty(1, dtype=np.uint32)
glCreateTextures(tex_type, len(tex), tex)
glTextureStorage2D(tex, levels, internalformat, W, H)

glTextureParameteri(tex, GL_TEXTURE_MIN_FILTER, min_filter)
glTextureParameteri(tex, GL_TEXTURE_MAG_FILTER, max_filter)

glTextureParameteri(tex, GL_TEXTURE_WRAP_S, wrap_s)
glTextureParameteri(tex, GL_TEXTURE_WRAP_T, wrap_t)
glTextureParameteri(tex, GL_TEXTURE_WRAP_R, wrap_r)

glTextureSubImage2D(tex, level, xoffset, yoffset,
width, height, data_format, data_type, pixels)

glGenerateTextureMipmap(tex)

handle = glGetTextureHandleNV(tex)
glMakeTextureHandleResidentNV(handle)

glMakeTextureHandleNonResidentNV(handle)

Renderbuffer

rb = np.empty(1, dtype=np.uint32)
glCreateRenderbuffers(len(rb), rb)
glNamedRenderbufferStorage(rb, internalformat, W, H)

# glNamedRenderbufferStorageMultisample(rb, samples, internalformat, W, H)

Render loop

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |  GL_STENCIL_BUFFER_BIT)
glViewport(0, 0, W, H)

glNamedBufferSubData(buf, offset, nbytes, data)

# glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, ctypes.c_void_p(obj_id*20))
# glDrawArraysIndirect(GL_TRIANGLES, ctypes.c_void_p(obj_id*16))
# glDrawArrays(GL_TRIANGLES, 0, 4) # First, count
# glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, None)