Computer Graphics/OpenGL 31

OpenGL 정리 - 20. 프레임 버퍼 (Frame Buffer)

1. 프레임 버퍼1.1 프레임 버퍼란프레임 버퍼는 OpenGL에서 렌더링된 이미지 데이터를 저장하는 버퍼로, 색상, 깊이, 스텐실 버퍼로 구성된 집합체이다. 일반적으로 OpenGL 컨텍스트를 생성할 때 기본 프레임 버퍼가 자동으로 생성되며, 화면에 그림을 그리기 위해 사용된다. 그러나 개발자가 직접 프레임 버퍼 객체(FBO)를 생성하여 렌더링 결과를 텍스처로 활용하거나, 포스트 프로세싱을 적용할 수도 있다.1.2 프레임 버퍼 목적프레임 버퍼는 다음과 같은 경우에 유용하게 사용된다:렌더링된 장면을 텍스처로 활용: 텍스처 매핑, 쉐도우 맵핑, 반사 효과 등.포스트 프로세싱: 렌더링 후 추가적인 효과(예: 블러, 감마 보정, 색상 반전 등)를 적용.2. 프레임 버퍼 사용 과정2.1 프레임 버퍼 생성 및 설정프..

OpenGL 정리 - 19. 스텐실(Stencil), 블랜딩(Blending), 컬링(Face Culling)

1. 스텐실(Stencil)1.1 스텐실 버퍼란?스텐실 버퍼는 컬러 및 깊이(depth) 버퍼 외에 특정 픽셀에만 그리기를 제한할 수 있는 8비트 정수형 버퍼이다. 이를 통해 렌더링할 영역을 선택적으로 제어할 수 있다.1.2 스텐실 테스트스텐실 테스트는 깊이 테스트 이전에 수행되며, 스텐실 버퍼에 저장된 값과 설정된 조건에 따라 해당 픽셀을 그릴지 여부를 결정한다. 다양한 연산을 지원하며, 아래와 같은 함수로 설정할 수 있다.활성화/비활성화: glEnable(GL_STENCIL_TEST); / glDisable(GL_STENCIL_TEST);스텐실 테스트 함수 설정: glStencilFunc(GL_EQUAL, 1, 0xFF); (비교 연산을 설정)스텐실 버퍼 업데이트 설정: glStencilOp(GL_K..

OpenGL 정리 - 18. Depth Buffer, 깊이값 왜곡, Z-fighting

Depth Testing1. Depth Buffer란?깊이 버퍼(Depth Buffer)는 렌더링 시 각 픽셀의 깊이값을 저장하는 버퍼로, 이를 통해 객체의 앞뒤 관계를 결정한다. 픽셀이 그려질 때마다 현재 그리려는 픽셀의 깊이값과 깊이 버퍼에 저장된 값이 비교되어, 조건에 맞으면 그리기를 수행하고 그렇지 않으면 무시한다.2. Depth Testing 사용하기깊이 테스트를 활성화하고 비활성화하는 방법은 다음과 같다.깊이 테스트 활성화: glEnable(GL_DEPTH_TEST);깊이 테스트 비활성화: glDisable(GL_DEPTH_TEST);깊이 테스트를 활성화하지 않으면, 객체가 그려진 순서대로 마지막 객체가 앞에 나타나며, 이전 객체는 덮어쓰여지게 된다.3. Depth Buffer 조작깊이 버퍼는..

OpenGL 정리 - 17. 오브젝트 로더 구현 (Assimp)

Objective박스 외의 오브젝트를 렌더링해보자. 실제 게임 등에 사용되는 오브젝트를 렌더링하기 위해 어떤 작업을 해야 할까?3D Modeling Tool을 이용해 3D 모델을 디자인.3D 모델 파일 포맷으로 저장.저장된 파일을 읽어들이는 Object Loader를 구현.3D Modeling Tool3D 모델을 생성하고 편집할 수 있는 도구들이 있으며, 다양한 작업을 처리할 수 있다:Modeling: 기본적인 형태를 만들고 수정하는 과정.Sculpting: 세밀한 디테일을 더하는 과정.UV Unwrapping: 3D 표면을 평면으로 펼쳐 텍스처를 입히는 과정.Rigging: 애니메이션을 위한 뼈대를 구성.Animation: 물체에 움직임을 부여.대표적인 툴:Blender 3D: 오픈소스, 강력한 기능을..

OpenGL 정리 - 16. Light Casters

이번에는 다양한 Light Casters에 대해 알아보겠다. Light Caster는 물체에 빛을 쏘는 광원의 유형을 의미하며, 주로 Directional Light, Point Light, Spot Light 세 가지가 많이 사용된다.1. Directional LightDirectional Light는 광원이 매우 멀리 떨어져 있어서 모든 지점에 동일한 방향으로 평행하게 빛이 발사되는 형태다. 태양과 같은 광원을 예로 들 수 있다. 태양처럼 광원이 무한히 멀리 있다고 가정하면, 지구 상의 모든 지점에 태양광이 같은 방향에서 들어오기 때문에 평행한 빛으로 처리하게 된다.2. Point LightPoint Light는 한 점에서 시작해서 모든 방향으로 빛이 퍼지는 광원이다. 흔히 볼 수 있는 전구가 대표적..

OpenGL 정리 - 15. Texture Map 적용

이번 포스팅에서는 Fragment Shader에서 텍스처를 적용하는 방법에 대해 다루겠다. 텍스처는 물체 표면에 색상을 입히는 중요한 역할을 하며, 이를 텍스처 맵핑(Texture Mapping)이라고 한다. 텍스처를 적용하려면 텍스처 이미지를 로드하고, 셰이더에서 사용할 수 있도록 유니폼으로 넘겨주는 과정이 필요하다.1. 텍스처 로딩 및 유니폼 설정먼저, 텍스처 이미지를 로드하고 이를 OpenGL에 바인딩한 후, 셰이더에서 사용할 수 있도록 유니폼으로 설정하는 과정을 살펴보겠다.텍스처 이미지 로드// 텍스처 이미지 로드 및 생성m_material.diffuse = Texture::CreateFromImage( Image::Load("./image/container2.png").get());m_ma..

OpenGL 정리 - 14. Phong Model 적용

이번에는 Phong 모델을 사용해 조명 처리를 어떻게 적용하는지 다루겠다.Phong 모델은 물체 표면의 색상을 결정할 때 주변광(ambient), 분산광(diffuse), 반사광(specular) 세 가지 요소를 더해 최종 색상을 계산하는 모델이다. 이 모델은 OpenGL에서 조명 효과를 구현할 때 많이 사용된다.1. 조명물체 표면의 색상은 빛의 상호작용으로 결정된다. 이 상호작용을 계산하는 데는 여러 방식이 있는데, 크게 Local Illumination과 Global Illumination으로 나눌 수 있다.Local Illumination은 물체가 직접적으로 받는 빛만을 고려하고, 반사광을 따로 계산하지 않는다. 반면, Global Illumination은 빛의 반사와 같은 요소까지 모두 고려해 더..

OpenGL 정리 - 13. IMGUI

이번은 IMGUI(Immediate Mode GUI)를 사용하여 OpenGL에 GUI를 손쉽게 적용하는 방법에 대해 설명하겠다.IMGUI는 즉시 모드 방식으로 UI를 구성하며, 별도의 복잡한 GUI 프레임워크 없이 간단하게 그래픽 요소를 그릴 수 있다.1. OpenGL에서의 GUI 구현의 어려움OpenGL에서 GUI 요소를 직접 구현하려면 상당한 노력이 필요하다. 기본적인 버튼, 슬라이더, 텍스트 필드 등을 구현하기 위해서는 셰이더(Shader), 프로그램(Program), VBO, VAO, EBO, Uniform, 텍스처(Texture) 등을 모두 관리해야 한다. 이러한 복잡한 과정은 개발자의 부담을 크게 늘릴 수 있다.GUI를 구현하는 데는 두 가지 방식이 있다:별도의 GUI 프레임워크를 사용하여 화..

OpenGL 정리 - 12. 카메라, View Transform

이번에는 OpenGL에서 카메라를 다루는 방법에 대해 정리하겠다.카메라는 3D 그래픽에서 화면을 어떤 시점에서, 어떤 방향으로 바라볼지를 결정하며, 이를 통해 사용자는 3D 공간을 자유롭게 탐색할 수 있다. 특히 카메라 조작과 관련된 수식과 이를 코드로 구현하는 방법을 설명하겠다.1. 카메라의 기본 개념3D 그래픽에서 카메라는 가상의 위치에 있으며, 우리가 보는 시야를 결정한다. 이를 위해 카메라 좌표계(Camera Space)에서 View Transform을 유도하는 여러 파라미터들이 필요하다.카메라 파라미터Camera Position: 카메라의 위치.Camera Target: 카메라가 바라보는 중심점.Camera Up Vector: 카메라 화면의 세로축을 결정하는 벡터. (일반적으로 Y축)위의 파라미..

OpenGL 정리 - 11. 큐브 그리기, Depth Buffer, 여러 큐브 그리기

OpenGL을 사용하여 3D 큐브를 그리는 방법과 좌표 변환, 깊이 버퍼, 그리고 여러 개의 큐브를 동시에 그리는 방법에 대해 배웠다. 기본적인 개념 설명과 함께 실제 코드 예시를 통해 어떻게 구현할 수 있는지 살펴보자.1. 좌표계와 변환좌표계는 local space, world space, view space, 그리고 clip space로 나뉜다. 물체는 처음에는 local space에서 정의되지만, 화면에 그려지기 위해서는 다른 좌표계로 변환되어야 한다. 이 변환 과정은 아래와 같다.Local Space -> World Space: 모델 변환 행렬을 통해 물체를 세계 좌표계로 변환한다.World Space -> View Space: 카메라의 위치와 방향을 반영하여 세계 좌표계를 카메라 좌표계로 변환한..