in lib/render/gl/render.py [0:0]
def __init__(self, width=1600, height=1200, name='GL Renderer',
program_files=['simple.fs', 'simple.vs'], color_size=1, ms_rate=1):
self.width = width
self.height = height
self.name = name
self.display_mode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH
self.use_inverse_depth = False
global _glut_window
if _glut_window is None:
glutInit()
glutInitDisplayMode(self.display_mode)
glutInitWindowSize(self.width, self.height)
glutInitWindowPosition(0, 0)
_glut_window = glutCreateWindow("My Render.")
# glEnable(GL_DEPTH_CLAMP)
glEnable(GL_DEPTH_TEST)
glClampColor(GL_CLAMP_READ_COLOR, GL_FALSE)
glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE)
glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE)
# init program
shader_list = []
for program_file in program_files:
_, ext = os.path.splitext(program_file)
if ext == '.vs':
shader_list.append(loadShader(GL_VERTEX_SHADER, program_file))
elif ext == '.fs':
shader_list.append(loadShader(GL_FRAGMENT_SHADER, program_file))
elif ext == '.gs':
shader_list.append(loadShader(GL_GEOMETRY_SHADER, program_file))
self.program = createProgram(shader_list)
for shader in shader_list:
glDeleteShader(shader)
# Init uniform variables
self.model_mat_unif = glGetUniformLocation(self.program, 'ModelMat')
self.persp_mat_unif = glGetUniformLocation(self.program, 'PerspMat')
self.vertex_buffer = glGenBuffers(1)
# Init screen quad program and buffer
self.quad_program, self.quad_buffer = self.init_quad_program()
# Configure frame buffer
self.frame_buffer = glGenFramebuffers(1)
glBindFramebuffer(GL_FRAMEBUFFER, self.frame_buffer)
self.intermediate_fbo = None
if ms_rate > 1:
# Configure texture buffer to render to
self.color_buffer = []
for i in range(color_size):
color_buffer = glGenTextures(1)
multi_sample_rate = ms_rate
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, color_buffer)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, multi_sample_rate, GL_RGBA32F, self.width, self.height, GL_TRUE)
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D_MULTISAMPLE, color_buffer, 0)
self.color_buffer.append(color_buffer)
self.render_buffer = glGenRenderbuffers(1)
glBindRenderbuffer(GL_RENDERBUFFER, self.render_buffer)
glRenderbufferStorageMultisample(GL_RENDERBUFFER, multi_sample_rate, GL_DEPTH24_STENCIL8, self.width, self.height)
glBindRenderbuffer(GL_RENDERBUFFER, 0)
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, self.render_buffer)
attachments = []
for i in range(color_size):
attachments.append(GL_COLOR_ATTACHMENT0 + i)
glDrawBuffers(color_size, attachments)
glBindFramebuffer(GL_FRAMEBUFFER, 0)
self.intermediate_fbo = glGenFramebuffers(1)
glBindFramebuffer(GL_FRAMEBUFFER, self.intermediate_fbo)
self.screen_texture = []
for i in range(color_size):
screen_texture = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, screen_texture)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, self.width, self.height, 0, GL_RGBA, GL_FLOAT, None)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, screen_texture, 0)
self.screen_texture.append(screen_texture)
glDrawBuffers(color_size, attachments)
glBindFramebuffer(GL_FRAMEBUFFER, 0)
else:
self.color_buffer = []
for i in range(color_size):
color_buffer = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, color_buffer)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, self.width, self.height, 0, GL_RGBA, GL_FLOAT, None)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, color_buffer, 0)
self.color_buffer.append(color_buffer)
# Configure depth texture map to render to
self.depth_buffer = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, self.depth_buffer)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL)
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, self.width, self.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, None)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, self.depth_buffer, 0)
attachments = []
for i in range(color_size):
attachments.append(GL_COLOR_ATTACHMENT0 + i)
glDrawBuffers(color_size, attachments)
self.screen_texture = self.color_buffer
glBindFramebuffer(GL_FRAMEBUFFER, 0)
# Configure texture buffer if needed
self.render_texture = None
# NOTE: original render_texture only support one input
# this is tentative member of this issue
self.render_texture_v2 = {}
# Inner storage for buffer data
self.vertex_data = None
self.vertex_dim = None
self.n_vertices = None
self.model_view_matrix = None
self.projection_matrix = None
glutDisplayFunc(self.display)