기본적으로 과제에서 요구하는 외부 라이브러리 제한을 무시하고, 먼저 완전한 프로그램을 만든 후 나중에 라이브러리를 직접 구현하는 방식으로 접근하고 있다. 이번 포스트에서는 랜덤한 버텍스 색상과 텍스처 적용 기능을 설명하겠다.
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, mesh->mColors[0][i].b);
} else {
// 랜덤 색상 적용
v.rgb = glm::vec3(
static_cast<float>(rand()) / static_cast<float>(RAND_MAX), // 0.0 ~ 1.0 사이의 난수 생성
static_cast<float>(rand()) / static_cast<float>(RAND_MAX),
static_cast<float>(rand()) / static_cast<float>(RAND_MAX)
);
}
이 코드는 Assimp 라이브러리를 사용하여 모델 데이터를 처리할 때, 각 버텍스에 대해 색상 데이터를 확인한 후, 만약 제공된 색상 정보가 없으면 RGB 값을 랜덤하게 할당한다. 이를 통해 객체가 화면에 다양한 색상으로 렌더링된다.
2. Texture 적용 및 해제
텍스처를 적용하거나 해제할 수 있는 기능도 추가했다. 사용자는 특정 키를 눌러 텍스처의 적용 여부를 토글할 수 있으며, 이때 텍스처와 버텍스 색상 간의 부드러운 전환이 이루어진다. 이 기능은 T 키로 텍스처를 활성화하거나 비활성화할 수 있도록 구현되었으며, 텍스처의 활성화 상태에 따라 색상 혼합이 이루어진다.
if (m_textureEnabled) {
if (m_textureMix < 1.0f) {
m_textureMix += 0.01f;
}
m_program->SetUniform("textureEnabled", true);
} else {
if (m_textureMix > 0.0f) {
m_textureMix -= 0.01f;
}
m_program->SetUniform("textureEnabled", false);
}
m_program->SetUniform("textureMix", m_textureMix);
이 코드에서 textureMix 값은 텍스처와 버텍스 색상의 혼합 비율을 조정한다. 텍스처가 활성화되면 textureMix 값이 증가하여 텍스처가 점차적으로 적용되며, 반대로 텍스처가 비활성화되면 textureMix 값이 감소하여 버텍스 색상이 점차적으로 드러난다. 이를 통해 시각적으로 자연스러운 전환이 이루어진다.
셰이더 코드에서도 텍스처와 색상 혼합을 처리하는 로직을 추가했다.
vec3 tColor = texture(mainTexture, TexCoords).rgb;
vec3 color = mix(RGB, tColor, textureMix);
FragColor = vec4(color, 1.0);
셰이더에서 textureMix 값을 사용해 버텍스 색상과 텍스처 색상을 혼합한 최종 색상을 계산하고, 이를 화면에 렌더링한다. 이 방식으로 사용자가 텍스처를 적용하거나 해제할 때 자연스러운 전환을 할 수 있다.
3. 결과

과제에서 요구하는 구현은 이 정도이다.
이제 이 과정에서 사용한 라이브러리들을 하나씩 직접 구현해 대체하는 단계로 넘어갈 예정이다.
현재 과제에서 사용하면 안 되는 라이브러리는 총 세 가지(glm, stb, assimp)이며, 모두 임시로 사용해 작업을 진행했다.
다음 포스트에서는 각 기능을 설명하면서 이 라이브러리들을 대체하는 방법과 코드를 다룰 예정이다.
'Computer Graphics > SCOP' 카테고리의 다른 글
| SCOP - 5. stb 대체하는 bmp 로더 만들기 (0) | 2024.09.29 |
|---|---|
| SCOP - 4. assimp 대체 라이브러리 만들기 (1) (0) | 2024.09.29 |
| SCOP - 3. assimp 대체 라이브러리 만들기 (0) (0) | 2024.09.29 |
| SCOP - 1. 오브젝트 이동, 회전 구현 (1) | 2024.09.25 |
| SCOP - 0. 과제해석 (1) | 2024.09.24 |