깊이 버퍼(depth buffer)
2023. 4. 1. 13:25ㆍ컴퓨터 그래픽스/그래픽 알고리즘 및 표현
깊이 버퍼는 사물의 앞 뒤를 판단하기 위해 이용하는 버퍼이다.
사물이 먼 순서대로 그리게 되면 상관이 없지만 순서대로 그리지 않지만 거리가 서로 다르다면 현실 세계를 제대로 반영하기가 어려워진다. 그래서 z 버퍼들을 가지고 사물이 어디가 앞이고 뒤인지 확인하는 것이다.
카메라는 z 축 정면을 보기 때문에 깊이 버퍼를 z축으로 한 것 같다.
z축을 기준으로 카메라의 위치와 물체의 위치를 픽셀 단위로 계산하면서 각 픽셀의 거리 최솟값에서만 색을 넣어주어서 저장하면 가장 가까운 거리에만 색이 입혀지게 되면서 앞 뒤가 구분되게 된다.
z버퍼는 모든 픽셀에 대하여 초기화가 되고 그려질 물체에만 색이 입혀지게 된다.
삼각형 그리기
const vec3 trianglePoint1;
const vec3 trianglePoint2;
const vec3 trianglePoint3;
const vec3 triangleColor1;
const vec3 triangleColor2;
const vec3 triangleColor3;
const auto v0 = WorldPositionToRaster(trianglePoint1);
const auto v1 = WorldPositionToRaster(trianglePoint2);
const auto v2 = WorldPositionToRaster(trianglePoint3);
for (int i = 0; i < height; i++)
{
for(int j =0; j < width; j++)
{
const auto point = vec2(float(i), float(j));
const auto alpha0 = crossProduct(v0,v1,point) / 2;
const auto alpha1 = crossProduct(v1,v2,point) / 2;
const auto alpha2 = crossproduct(v2, v0, point) / 2; // 삼각형의 왼손법칙을 고려하지 않고 임의로 만든 것임
if(alpha0 >= 0.0f && alpha1 >= 0.0f, alpha2 >=0 )
{
const float area = alpha0 + alpha1 + alpha2;
const float color = alpha0 * triangleColor1 + alpha1 * triangleColor2 + alpha2 * triangleColor3 / area;
const float z = alpha0 * v0.z + alpha1* v1.z + alpha2*v2.z / area; // barycentric
if(z < depthBuffer[height*i + j]) {
depthBuffer[height*i + j] = z;
pixels[height*i + j] = vec4(color, 0.0f)
}
}
}
}
'컴퓨터 그래픽스 > 그래픽 알고리즘 및 표현' 카테고리의 다른 글
shading 표현 (0) | 2023.05.06 |
---|---|
backface culling, 원근법 (0) | 2023.05.03 |
2차원 transformation (0) | 2023.02.22 |
Rasterization 원 그리기 (0) | 2023.02.22 |
Rasterization (0) | 2023.02.15 |