OpenGL (docs.gl)
glGenBuffers
void glGenBuffers(GLsizei n, GLuint* buffers)
- n: 생성될 버퍼 개체 이름의 수
- buffers: 생성된 버퍼 객체 이름이 저장되는 배열
glBindBuffer
void glBindBuffer(GLenum target, GLuint buffer)
- target: 버퍼 개체가 바인딩되는 대상

- buffer: 버퍼 객체의 이름 지정
glBufferData
void glbufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
- target: 버퍼 개체가 바인딩되는 대상
- size: 버퍼 객체의 새 데이터 저장소 크기(byte)
- data: 초기화를 위해 데이터 저장소에 복사될 데이터에 대한 포인터 지정. 만약, 데이터를 복사하지 않을 경우 NULL
- usage: 데이터 저장소의 예상 사용 패턴
GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY,
GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY,
GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_DYNAMIC_COPY
STREAM, STATIC, DYNAMIC
- STREAM: 데이터 저장소의 내용은 한 번만 수정되며, 사용 횟수가 적음
- STATIC: 데이터 저장소의 내용은 한 번만 수정되며, 여러번 사용
- DYNAMIC: 데이터 저장소의 내용은 반복적으로 수정되며, 여러번 사용
DRAW, READ, COPY
- DRAW: 데이터 저장소의 내용은 애플리케이션에 의해 수정되며, GL drawing 및 이미지 지정 명령의 소스로 사용됨
- READ: 데이터 저장소의 내용은 GL에서 데이터를 읽어 수정되며, 애플리케이션에서 쿼리를 보낼 때 해당 데이터를 반환하는데 사용됨
- COPY: 데이터 저장소의 내용은 GL에서 데이터를 읽어 수정되며, GL drawing 및 이미지 지정 명령의 소스로 사용됨
과정
unsigned int bufferID;
glGenBuffers(1, &bufferID);
glBindBuffer(GL_ARRAY_BUFFER, bufferID); // bind == activate
glBufferData(GL_ARRAY_BUFFER, // 실제 CPU -> GPU
6 * sizeof(float),
position,
GL_STATIC_DRAW);
- Buffer 생성 후 BufferId 저장 (glGenBuffers)
- bufferID에 저장된 Buffer 활성화 (glBindBuffer)
- 활성화된 Buffer 객체에 새 데이터 저장소를 업로드 (glBufferData)
glDrawArrays
void glDrawArrays(GLenum mode, GLint first, GLsizei count)
GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES,
GL_LINE_STRIP_ADJACENCY, GL_LINES_ADJACENCY, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN,
GL_TRIANGLES, GL_TRIANGLE_STRIP_ADJACENCY, GL_TRIANGLES_ADJACENCY, GL_PATCHES
- first: 활성화된 배열의 시작 인덱스 지정
- count: 렌더링할 인덱스의 수 지정
glfwSwapBuffers(window)
- gl 명령어를 통해 작성된 그래픽을 앞선 buffer와 교체
과정
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3); //draw call
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
{
객체지향 방식
Triangle t1, t2; // 삼각형 두 개를 정의
Draw(t1); // t1 객체를 전달함으로써 삼각형 1을 그림
Draw(t2); // t2 객체를 전달함으로써 삼각형 2를 그림
State Machine 방식
Triangle t1, t2; // 삼각형 두 개를 정의
Activate(t1); // 삼각형 1을 처리중인 상태로 설정
Draw(); // 현재 처리중인 데이터(t1)를 화면에 그림
Activate(t2); // 삼각형 2를 처리중인 상태로 설정
Draw(); // 현재 처리중인 데이터(t2)를 화면에 그림
- openGL은 일반적인 객체 지향 프로그램의 설계와는 다르게, State Machine 방식과 유사함
- 현재 처리할 데이터를 선택한 후, 현재 실행해야 할 작업을 함수 호출을 통해 처리하는 방식
삼각형 그리는 Legacy 코드
glBegin(GL_TRIANGLES);
glVertex2f(-0.5f, -0.5f);
glVertex2f( 0.0f, 0.5f);
glvertex2f( 0.5f, -0.5f);
glEnd();
- Legacy 방식의 경우 Shader에 대해 default값이 있기에 Shader 정보가 없어도 그림을 그림.
진행과정
참고영상
참고자료
객체지향 방식 / State Machine 방식