1992년 SGI가 만든 크로스플랫폼 그래픽스 API. 현대 GPU 파이프라인의 기반 개념 출발점. 현재는 레거시.

엔진과 OpenGL의 관계

 

UE5 Material editior에서 노드 연결 -> HLSL 셰이더 생성 -> DX12 / Vulkan / Metal -> GPU 드라이버 -> GPU 하드웨어 실행

OpenGL은 이 중간 계층에 위치. 엔진이 추상화해서 숨겨놓은 것들을 직접 다루는 것.

 

OpenGL 렌더링의 핵심 흐름

 

CPU ( Application )

1. 버텍스 데이터 정의

2. GPU 메모리에 업로드 

VBO -> 버텍스 데이터

VAO -> 데이터 레이아웃 설명

EBO -> 인덱스 데이터

3. 셰이더 컴파일 + 링크, 버텍스 셰이더 + 픽셀 셰이더

4. 드로우콜 발생

->

GPU ( Pipeline )

버텍스 셰이더 -> 좌표 전환

래스터화 -> 픽셀로 변환

픽셀 셰이더 -> 색상 결정

프레임버퍼 -> 화면 출력

 

핵심 오브젝트 3종 - VAO / VBO / EBO

// VBO ( Vertex Buffer Object )
// GPU 메모리에 버텍스 데이터를 저장하는 버퍼
unsigned int VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// VAO ( Vertex Array Object )
// 이 버텍스 데이터가 어떻게 생겼는지 설명
// 위치 = 3개 float, 색상 = 3개 float, UV = 2개 float..
unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

// EBO ( Element Buffer Object )
// 버텍스를 인덱스로 참조. 중복 버텍스 방지
unsigned int indices[] = {0,1,2, 0,2,3}; // 삼각형 2개
unsigned int EBO;
glGenBuffers(1, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

 

셰이더 작성과 컴파일 흐름

// 버텍스 셰이더 (GLSL)
#version 330 core
layout (location = 0) in vec3 aPos; // 버텍스 입력
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord; // 픽셀 셰이더로 전달

uniform mat4 model; // CPU에서 전달하는 값
uniform mat4 view;
uniform mat4 projection;

void main()
{
	// MVP 행렬 변환 - UE5 버텍스 셰이더가 하는 일
    gl_Position = projection * view * model * vec4(aPos, 1.0);
    TexCoord = aTexCoord;
}

// 픽셀(프래그먼트) 셰이더 (GLSL)
#version 330 core
in vec2 TexCoord;
out vec4 FragColor; // 최종 픽셀 색상

uniform sampler2D texture1; // 텍스처 샘플러

void main()
{
	FragColor = texture(texture1, TexCoord); // UE5 머터리얼 노드의  TextureSample이 이것
}

// CPU에서 셰이더 컴파일
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(VertexShader);

// 링크
unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader):
glLinkProgram(shaderProgram);

 

OpenGL과 UE5 1:1 대응

 

VBO + VAO -> StaticMesh 버텍스 버퍼 : GPU 메모리의 메시 데이터

버텍스 셰이더 -> Material의 World Position Offset : 버텍스 변환

픽셀 셰이더 -> Material 노드 전체 : 픽셀 색상 결정

uniform 변수 -> Material Parameter : CPU->GPU 데이터 전달

텍스처 샘플러 -> TextureSample 노드 : 텍스처에서 색상 읽기

Framebuffer -> Render Target : 렌더링 결과물 저장

glDrawArrays -> Draw Call : GPU에 렌더링 명령

깊이 테스트 -> Depth Buffer : z파이팅, 오클루전

 

OpenGL 버전 흐름

OpenGL 1.0 (1992) : 고정 파이프라인, 셰이더 없음

OpenGL 2.0 (2004) : GLSL 셰이더 도입. 프로그래머블 파이프라인

OpenGL 3.3 (2010) : 레거시 제거. 현재 학습 기준점

OpenGL 4.6 (2017) : 최신. 컴퓨트 셰이더 등 현대 기능

 

OpenGL ES 2.0 : 모바일/임베디드. OpenGL 2.0기반

OpenGL ES 3.0 : 현대 모바일 기준. 컴퓨트 셰이더 지원

 

Vulkan (2016) : OpenGL의 후계자. 저수준 제어

 

연결되는 단어들

 

GLSL : OpenGL 셰이더 언어. HLSL과 문법 유사. 개념은 동일

 

프레임버퍼 (Framebuffer) : 렌더링 결과를 저장하는 버퍼. UE5 Render Target과 동일 개념. 포스트 프로세싱의 기반

 

텍스처 유닛 : GPU가 동시에 바인딩할 수 있는 텍스처 슬롯. OpenGL에서 최소 16개. UE5 머터리얼의 텍스처 슬롯 제한이 여기서 나옴

 

면향 컬링 (Face Culling) : 뒷면 폴리곤을 그리지 않는 최적화. OpenGL에서 glEnable(GL_CULL_FACE).UE5에서 Two Sided 머터리얼 옵션이 이것을 끄는 것.

'Word' 카테고리의 다른 글

Vulkan  (0) 2026.07.09
DirectX/ Direct3D  (0) 2026.07.08
스마트 포인터 ( Smart Pointer )  (0) 2026.07.06
SOLID 원칙  (0) 2026.07.06
나라티브 디자인 ( Narrative Design )  (0) 2026.07.06

+ Recent posts