깊이 버퍼(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