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 |
