Computer Graphics/SCOP 8

SCOP - 7. 평가 피드백

첫 3번의 평가를 마쳤다. 결과는 아쉽게도 Fail이다. 구현 자체는 잘 되었으나, obj 파일 파싱 부분에서 기본적인 실수를 범했다 ㅠㅠ. 그로 인해 중요한 오류들이 발생했다.1. f 인덱스 에러 처리 문제첫 번째 문제는 obj 파일의 f 인덱스가 정상적인 범위를 벗어나는 경우에 대한 에러 처리를 하지 않았다는 점이다. 인덱스가 v(버텍스 개수)를 초과하거나 음수값이 들어올 때 에러를 처리해주지 않아서, 나중에 벡터에서 해당 인덱스를 참조하려 할 때 segmentation fault가 발생했다.이것은 아주 치명적인 실수였다. 분명 인덱싱하는 과정에서 한 번쯤 고려했어야 했는데 깜빡하고 처리하지 않았다.2. 파일 확장자 확인 오류두 번째 실수는 완전히 놓친 부분이었다. 아래와 같은 코드로 .obj 파일 ..

SCOP - 6. glm 대체하는 sglm 만들기

드디어 glm 라이브러리를 완전히 대체할 sglm 라이브러리를 개발하고 적용했다. 이로써 SCOP 프로젝트에서 사용하던 모든 외부 라이브러리가 대체되어 직접 구현한 코드로만 구성되었다.하지만 이를 구현하는 과정에서 몇 가지 문제가 있었다. 특히, 행렬 변환 시 OpenGL의 열 우선 저장 방식과 3D 그래픽에서의 다양한 변환들이 어려움을 줬다. 이 포스트에서는 이러한 문제를 해결한 경험과 함께 sglm 의 주요 변환 함수인 translate, lookAt, perspective의 의미와 역할에 대해 서술하려 한다.  행렬 저장 방식에서의 문제행렬 변환을 구현하는 과정에서 가장 어려웠던 부분은 행렬이 OpenGL에서는 열 우선(column-major) 방식으로 저장된다는 것이었다. 처음에는 일반적인 수학적..

SCOP - 5. stb 대체하는 bmp 로더 만들기

이번 포스트에서는 stb 라이브러리를 대체하기 위해 추가한 BMP 로더에 대해 설명한다. stb_image를 사용해 이미지를 로드하는 기능을 직접 구현함으로써 라이브러리 의존성을 제거했다. 여기서 BMP 파일을 로드하고 처리하는 LoadWithBmp() 함수가 이번에 추가된 부분이다.BMP 로더 핵심 로직BMP 파일 로딩은 기존 stb_image를 사용한 로딩 방식과 다르게 직접 바이너리 데이터를 읽어와 이미지의 정보를 추출하고, 이를 m_data 버퍼에 저장하는 과정을 거친다. 자세한 로직은 다음과 같다.bool Image::LoadWithBmp(const std::string& filepath) { std::ifstream file(filepath, std::ios::binary); if ..

SCOP - 4. assimp 대체 라이브러리 만들기 (1)

assimp 라이브러리를 대체하기 위해 개발한 sAssimp 라이브러리의 개선 사항을 포스트하겠다.이전에 언급했던 모델이 흐릿하거나 뭉뜬그려지는 문제는 인덱스 처리 오류로 밝혀졌으며, 이를 수정했다. 또한, 데이터 복사에 대한 우려로 인해 깊은 복사를 사용했었으나, OpenGL 버퍼에 데이터가 이미 저장된 이후에는 C++ 코드에서 데이터 관리를 직접 하지 않아도 된다는 것을 알게 되어 코드 구조를 변경했다. 최대한 기존 코드를 유지하면서 불필요한 복사를 줄이고 인덱싱 과정에서 최적화를 진행했고, 그 핵심 로직은 아래 Indexing() 함수에 있다.void sAssimp::Indexing() { uint32_t index = 0; for (auto& face : m_faces) { ..

SCOP - 3. assimp 대체 라이브러리 만들기 (0)

이번 포스트에서는 기존에 사용하던 assimp 라이브러리를 대체하기 위해 새로운 라이브러리를 만드는 과정을 설명하려 한다. 이름은 내 닉네임을 딴 sAssimp로 정했다.1. assimp 라이브러리란?assimp는 OpenGL 등 다양한 그래픽 API에서 사용하는 3D 모델 데이터를 쉽게 로드하고 처리할 수 있도록 도와주는 라이브러리이다. .obj, .fbx 등의 파일 포맷을 파싱하고, 모델의 버텍스(vertex), 인덱스(indices), 노멀(normal) 및 텍스처 좌표 등을 가져와 렌더링에 사용할 수 있게 한다. 이 라이브러리를 사용하면 다양한 3D 모델 포맷을 다루는 작업을 간단하게 처리할 수 있다. 2. 과제에 맞는 sAssimp 라이브러리bool sAssimp::LoadBysAssimp(co..

SCOP - 2. 랜덤한 vertex 색 적용 및 texture 적용

기본적으로 과제에서 요구하는 외부 라이브러리 제한을 무시하고, 먼저 완전한 프로그램을 만든 후 나중에 라이브러리를 직접 구현하는 방식으로 접근하고 있다. 이번 포스트에서는 랜덤한 버텍스 색상과 텍스처 적용 기능을 설명하겠다.1. 랜덤한 Vertex 색 적용버텍스의 색상을 랜덤하게 지정하는 기능을 구현했다. 3D 모델의 각 버텍스마다 고유한 색을 부여하여, 화면에 표시될 때 다양한 색상의 면이 나타나도록 했다. rand() 함수를 사용해 0.0부터 1.0 사이의 난수를 생성하고, 이를 RGB 값으로 변환하여 각 버텍스에 할당했다.if (mesh->HasVertexColors(0)) { v.rgb = glm::vec3(mesh->mColors[0][i].r, mesh->mColors[0][i].g, m..

SCOP - 1. 오브젝트 이동, 회전 구현

OpenGL 지금까지 공부한 코드를 그대로 가져와 내 입맛대로 변경하여 과제를 완료하려고 한다.github commit상 09-03에 해당하는 코드를 가져왔다.https://surkim.tistory.com/32 OpenGL 정리 - 17. 오브젝트 로더 구현 (Assimp)Objective박스 외의 오브젝트를 렌더링해보자. 실제 게임 등에 사용되는 오브젝트를 렌더링하기 위해 어떤 작업을 해야 할까?3D Modeling Tool을 이용해 3D 모델을 디자인.3D 모델 파일 포맷으로 저장.저surkim.tistory.com 과제에서는 이벤트 입력과 창 띄우는 거 외에 모든 라이브러리를 사용해선 안 된다고 했지만, 일단 모든 라이브러리를 사용해 프로젝트를 완성하고 그 라이브러리들을 대체해 나가는 방식으로 접..

SCOP - 0. 과제해석

이번 SCOP 과제는 OpenGL을 배우면서 기본적인 GPU 렌더링을 연습하기 위한 첫 번째 과제이다. 3D 객체를 파싱하고 화면에 렌더링하는 경험을 쌓기 위해 이 과제를 선택하게 되었다. 특히, 이 프로젝트는 OpenGL의 여러 기능을 체험할 수 있는 좋은 기회로 생각하고 있으며, 과제의 세부 사항은 다음과 같다.프로젝트 개요SCOP 프로젝트는 3D 객체를 화면에 렌더링하는 프로그램을 개발하는 것을 목표로 한다. 객체는 .obj 파일로부터 파싱되며, 프로그램은 해당 객체를 화면에 퍼스펙티브로 회전시켜 보여준다. 각 면은 다른 색상으로 구분되고, 특정 키를 누르면 텍스처가 적용되며 다시 누르면 색상 모드로 돌아간다. 이 과정은 부드러운 전환이 필요하다.목표OpenGL을 사용해 3D 객체를 화면에 렌더링하..