Variance shadow maps are a type of shadow mapping technique used in 3D graphics to accurately represent the shadows cast by 3D objects in a scene. They are designed to eliminate the artifact known as "shadow acne" (where shadows appear as dots or jagged lines on the surface of objects) and provide more consistent and smooth shadows.
The variance shadow map algorithm uses two maps to store information about the depth of the shadow: a depth map, which stores the depth of each pixel from the light source, and a variance map, which stores the variance of that depth value. The depth map is used to calculate the shadows and the variance map is used to determine the quality of the shadows.
Variance shadow maps provide more accurate shadows by using a statistical approach to calculate the shadow values. They are also faster than traditional shadow maps because they reduce the number of samples needed to get accurate shadow results.
Overall, variance shadow maps offer a better representation of shadows in 3D graphics compared to traditional shadow maps, making them an important tool for creating realistic and immersive 3D environments.
분산 그림자 맵은 장면에서 3D 객체가 드리우는 그림자를 정확하게 표현하기 위해 3D 그래픽에 사용되는 일종의 그림자 매핑 기술입니다. 그들은 "그림자 여드름"(그림자가 개체 표면에 점이나 들쭉날쭉한 선으로 나타나는 현상)으로 알려진 아티팩트를 제거하고 보다 일관되고 부드러운 그림자를 제공하도록 설계되었습니다.
분산 그림자 맵 알고리즘은 그림자의 깊이에 대한 정보를 저장하기 위해 두 개의 맵을 사용합니다. 광원에서 각 픽셀의 깊이를 저장하는 깊이 맵과 해당 깊이 값의 분산을 저장하는 분산 맵입니다. 깊이 맵은 그림자를 계산하는 데 사용되고 분산 맵은 그림자의 품질을 결정하는 데 사용됩니다.
분산 그림자 맵은 그림자 값을 계산하기 위해 통계적 접근 방식을 사용하여 보다 정확한 그림자를 제공합니다. 또한 정확한 그림자 결과를 얻는 데 필요한 샘플 수를 줄이기 때문에 기존 그림자 맵보다 빠릅니다.
전반적으로 분산 그림자 맵은 기존 그림자 맵에 비해 3D 그래픽에서 그림자를 더 잘 표현하므로 사실적이고 몰입감 있는 3D 환경을 만드는 데 중요한 도구입니다.
서버와 주고 받는 패킷을 정의하는 코드 상단에 #pragma pack(1)이란 전처리문을 발견했다.
이 전처리문은 이 후 정의되는 구조체의 크기를 1바이트 단위로 지정할 수 있도록 한다.
구조체의 크기는 프로그램이 실행되는 플랫폼에 따라 데이터가 처리될 때 가장 빨리 실행될 수 있는 데이터의 기본 단위로 맞춰진다. 32/64비트의 운영체제에서는 4바이트가 기준이다. 만약 구조체의 크기가 4의 배수가 안될 경우 패딩비트라는 것으로 채워서 어떻게든 4바이트를 만들어 처리 속도를 최적화 한다.
그런데 서버와 패킷을 주고 받는 경우 1바이트 단위가 아니면 전송 데이터가 늘어나고 패킷을 처리하는 데이터 단위가 달라질 수 있다.
이를 막기 위해 운영체제와 상관없이 무조건 1바이트 단위로 구조체의 크기를 결정하도록 하는 전처리 지시문이 #pragma pack(1)이다.
pack(1)에서 숫자 1을 2로 바꾸면 2바이트 단위로 구조체의 크기를 결정하게 된다.
이렇게 구조체의 크기 단위를 임의로 설정하는 구간이 끝나면 #pragma pack()으로 다시 기본 상태로 돌려 놓아서 다른 구조체의 크기 최적화를 방해하지 않도록 한다.
// #pragma pack(1)를 지정하지 않은 경우
typedef struct A_ { char c; } A;
int main()
{
A a;
sizeof(a); // 크기가 4byte로 나온다.
}
// ------------------------------ //
// #pragma pack(1)를 지정하여 구조체의 기본 크기 단위를 1바이트로 저정한 경우
#pragma pack(1)
typedef struct A_ { char c; } A;
int main()
{
A a;
sizeof(a); // 크기가 1byte로 나온다.
}
// 구조체의 기본 크기 단위를 플랫폼 기본값으로 설정하여 구조체의 기본 크기를 4byte로 돌린다.
#pragma pack()