[python] 파이썬으로 OpenGL을 활용한 실시간 렌더링 효과 구현

본 블로그 포스트에서는 파이썬과 OpenGL을 함께 사용하여 실시간 렌더링 효과를 구현하는 방법에 대해 알아보겠습니다. OpenGL은 2D 및 3D 그래픽을 렌더링하기 위한 크로스 플랫폼 라이브러리로, 파이썬에서는 PyOpenGL 라이브러리를 통해 사용할 수 있습니다.

필요한 라이브러리 설치

먼저, PyOpenGL 라이브러리를 설치해야 합니다. 아래 명령을 사용하여 파이썬 가상환경에서 PyOpenGL을 설치합니다.

pip install PyOpenGL

OpenGL 창 생성

OpenGL 창을 생성하고 초기화하기 위해 glut 모듈을 사용합니다. 다음 예제 코드는 빈 OpenGL 창을 생성하는 간단한 예제입니다.

from OpenGL.GL import *
from OpenGL.GLUT import *

def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glFlush()

glutInit()
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE)
glutInitWindowSize(500, 500)
glutCreateWindow(b"OpenGL Window")
glutDisplayFunc(display)
glutMainLoop()

이 코드를 실행하면 크기가 500x500 픽셀인 빈 OpenGL 창이 생성됩니다.

기본 도형 그리기

OpenGL을 사용하여 다양한 도형을 그릴 수 있습니다. 다음은 파이썬으로 사각형을 그리는 예제 코드입니다.

def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    
    glBegin(GL_QUADS)
    glVertex2f(-0.5, -0.5)
    glVertex2f(0.5, -0.5)
    glVertex2f(0.5, 0.5)
    glVertex2f(-0.5, 0.5)
    glEnd()
    
    glFlush()

glutDisplayFunc(display)
glutMainLoop()

이 코드를 실행하면 사각형이 화면에 나타납니다.

텍스처 매핑

OpenGL을 사용하여 텍스처를 매핑할 수도 있습니다. 다음은 파이썬으로 텍스처 매핑을 구현한 예제 코드입니다.

from PIL import Image
import numpy as np

def load_texture():
    image = Image.open("texture.jpg")
    width, height = image.size
    image_data = np.array(list(image.getdata()), np.uint8)
    
    texture_id = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture_id)
    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_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image_data)

def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D, texture_id)
    
    glBegin(GL_QUADS)
    glTexCoord2f(0.0, 0.0)
    glVertex2f(-0.5, -0.5)
    glTexCoord2f(1.0, 0.0)
    glVertex2f(0.5, -0.5)
    glTexCoord2f(1.0, 1.0)
    glVertex2f(0.5, 0.5)
    glTexCoord2f(0.0, 1.0)
    glVertex2f(-0.5, 0.5)
    glEnd()
    
    glDisable(GL_TEXTURE_2D)
    glFlush()

glutDisplayFunc(display)
glutMainLoop()

위 코드에서 load_texture() 함수는 텍스처를 로드하고 OpenGL에 바인딩하는 역할을 합니다. display() 함수에서는 glBegin(GL_QUADS)glTexCoord2f()를 통해 텍스처 좌표를 지정하고, 사각형을 그립니다.

결론

파이썬과 PyOpenGL을 함께 사용하여 실시간 렌더링 효과를 구현하는 방법에 대해 알아보았습니다. 이를 통해 다양한 도형을 그리고 텍스처를 매핑할 수 있습니다. 더 심화된 내용을 배우고 싶다면 OpenGL 공식 문서 및 예제 코드를 참고하는 것을 추천합니다.