[python] PyOpenGL을 활용하여 3D 모델에 쉐이더 적용하기

쉐이더(Shader)는 3D 그래픽 프로그래밍에서 그래픽 객체의 렌더링 및 효과를 제어하는 역할을 합니다. PyOpenGL은 OpenGL을 파이썬에서 사용할 수 있도록 해주는 라이브러리입니다. 이번에는 PyOpenGL을 사용하여 3D 모델에 쉐이더를 적용하는 방법을 알아보겠습니다.

1. PyOpenGL 설치

먼저 PyOpenGL을 설치해야 합니다. 아래의 명령을 사용하여 PyOpenGL을 설치할 수 있습니다.

pip install PyOpenGL

2. 쉐이더 파일 작성

쉐이더는 GLSL(OpenGL Shading Language)이라는 언어로 작성됩니다. 쉐이더 파일을 작성해보겠습니다.

#version 330 core

layout(location = 0) in vec3 position;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * vec4(position, 1.0);
}

위의 예제는 정점 쉐이더(Vertex Shader)로, position이라는 입력 변수를 받아 모델, 뷰, 투영 행렬을 곱한 후 최종 위치를 계산하여 gl_Position에 저장합니다.

3. Python 코드 작성

이제 PyOpenGL을 사용하여 쉐이더를 적용하는 Python 코드를 작성해보겠습니다.

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
import sys

def draw():
    glEnable(GL_DEPTH_TEST)
    
    # 정점 쉐이더 코드 불러오기
    vertex_shader_source = open("vertex_shader.glsl", "r").read()
    vertex_shader = glCreateShader(GL_VERTEX_SHADER)
    glShaderSource(vertex_shader, vertex_shader_source)
    glCompileShader(vertex_shader)
    
    # 쉐이더 프로그램 생성
    shader_program = glCreateProgram()
    glAttachShader(shader_program, vertex_shader)
    glLinkProgram(shader_program)
    glUseProgram(shader_program)
    
    # 그리기 코드 작성
    glBegin(GL_TRIANGLES)
    glVertex3f(-0.6, -0.6, 0)
    glVertex3f(0.6, -0.6, 0)
    glVertex3f(0, 0.6, 0)
    glEnd()
    
    glFlush()
    glutSwapBuffers()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500, 500)
    glutCreateWindow(b"PyOpenGL Example")
    glutDisplayFunc(draw)
    glutMainLoop()

if __name__ == "__main__":
    main()

위의 코드는 OpenGL 초기화를 위한 설정, 쉐이더 코드 불러오기, 쉐이더 프로그램 생성 및 사용, 그리기 코드 작성 등을 수행합니다. 주석을 통해 코드의 각 부분을 설명해두었습니다.

4. 실행

위의 Python 코드를 실행하면 윈도우 창이 열리고 정삼각형이 그려집니다. 윈도우 창을 닫으려면 Esc 키를 누르거나 창을 닫을 때까지 기다립니다.

PyOpenGL을 사용하여 3D 모델에 쉐이더를 적용하는 방법에 대해 알아보았습니다. 이를 통해 더 다양하고 효과적인 3D 그래픽 애플리케이션을 개발할 수 있습니다.