OpenGL Start

정민용·2025년 1월 8일

OpenGL

목록 보기
1/5

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);
  1. Buffer 생성 후 BufferId 저장 (glGenBuffers)
  2. bufferID에 저장된 Buffer 활성화 (glBindBuffer)
  3. 활성화된 Buffer 객체에 새 데이터 저장소를 업로드 (glBufferData)

glDrawArrays

void glDrawArrays(GLenum mode, GLint first, GLsizei count)

  • mode: 렌더링할 기본 유형 종류 지정
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 방식

0개의 댓글