41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
# src/shader_manager.py
|
|
import OpenGL.GL as gl
|
|
|
|
class ShaderManager:
|
|
def __init__(self):
|
|
pass
|
|
|
|
def compile_shader(self, vertex_src: str, fragment_src: str) -> int:
|
|
program = gl.glCreateProgram()
|
|
|
|
def _compile(src, shader_type):
|
|
shader = gl.glCreateShader(shader_type)
|
|
gl.glShaderSource(shader, src)
|
|
gl.glCompileShader(shader)
|
|
|
|
if not gl.glGetShaderiv(shader, gl.GL_COMPILE_STATUS):
|
|
info_log = gl.glGetShaderInfoLog(shader)
|
|
if hasattr(info_log, "decode"):
|
|
info_log = info_log.decode()
|
|
raise RuntimeError(f"Shader compilation failed: {info_log}")
|
|
return shader
|
|
|
|
vert_shader = _compile(vertex_src, gl.GL_VERTEX_SHADER)
|
|
frag_shader = _compile(fragment_src, gl.GL_FRAGMENT_SHADER)
|
|
|
|
gl.glAttachShader(program, vert_shader)
|
|
gl.glAttachShader(program, frag_shader)
|
|
gl.glLinkProgram(program)
|
|
|
|
if not gl.glGetProgramiv(program, gl.GL_LINK_STATUS):
|
|
info_log = gl.glGetProgramInfoLog(program)
|
|
if hasattr(info_log, "decode"):
|
|
info_log = info_log.decode()
|
|
raise RuntimeError(f"Program linking failed: {info_log}")
|
|
|
|
# Optional: delete shaders as they are linked into the program
|
|
gl.glDeleteShader(vert_shader)
|
|
gl.glDeleteShader(frag_shader)
|
|
|
|
return program
|