상세 컨텐츠

본문 제목

[Python Opengl for glfw] Python을 활용하여 glfw로 삼각형 만들기

Python

by donggyu1998 2021. 9. 11. 15:37

본문

반응형

💡 글 작성자는 vscode를 활용하여 Python을 작성하고있습니다.

 

💡 pip를 진행 해준다.

1. pip install glfw

 

💡 [실행 화면]

💡 [코드]

import glfw
from OpenGL.GL import *
import OpenGL.GL.shaders as shaders
import numpy


def main():

    # glfw.init가 아니라면 return
    if not glfw.init():
        return

    window = glfw.create_window(800, 600, "My OpenGL window", None, None)

    #윈도우 생성 실패시 glfw 종료
    if not window:
        glfw.terminate()
        return

    # context 생성
    glfw.make_context_current(window)

    #            positions        colors
    triangle = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0,
                 0.5, -0.5, 0.0, 0.0, 1.0, 0.0,
                 0.0,  0.5, 0.0, 0.0, 0.0, 1.0] 


    #triangle의 타입을 변환
    # 4 byte * 18 = 72 byte
    triangle = numpy.array(triangle, dtype = numpy.float32)

    print(triangle.itemsize * triangle.size)
    
    vertex_shader_source = """
    #version 330
    in vec3 position;
    in vec3 color;

    out vec3 newColor;
    void main()
    {
        gl_Position = vec4(position, 1.0f);
        newColor = color;
    }
    """

    fragment_shader_source = """
    #version 330
    in vec3 newColor;

    out vec4 outColor;
    void main()
    {
        outColor = vec4(newColor, 1.0f);
    }
    """

    # 쉐이더 선언
    vertex_shader = shaders.compileShader(vertex_shader_source, GL_VERTEX_SHADER)
    fragment_shader = shaders.compileShader(fragment_shader_source, GL_FRAGMENT_SHADER)
    shader = shaders.compileProgram(vertex_shader, fragment_shader)

    # 버퍼 생성
    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)
    glBufferData(GL_ARRAY_BUFFER, 72, triangle, GL_STATIC_DRAW)


    position = glGetAttribLocation(shader, "position")
    glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(0))
    glEnableVertexAttribArray(position)

    color = glGetAttribLocation(shader, "color")
    glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(12))
    glEnableVertexAttribArray(color)

    glUseProgram(shader)

    glClearColor(0, 0, 0, 0)

    while not glfw.window_should_close(window):
        glfw.poll_events()

        glClear(GL_COLOR_BUFFER_BIT)

        glDrawArrays(GL_TRIANGLES, 0, 3)

        glfw.swap_buffers(window)

    glfw.terminate()


if __name__ == "__main__":
    main()
반응형

관련글 더보기