그래픽스/DX11

DX11 HongLap - 빛의 반사

게임 개발 2024. 4. 17. 19:53

 

구의 Reflection 수치 값을 변경해주기 전이다. 

 

구 1개만 반사 적용

 

 

 

구 2개에 반사광 적용

 

 

바닥까지 반사광 적용

 

이는 레이트레이싱을 이용한 반사광 적용이다.

반사되는 횟수가 많아질수록 고성능을 요구하기 때문에 컴퓨터 사양에 따라 좀 느려지기도 한다.

 

해당 이론은 Bilinear Interpolation즉 이중선형 보간과 관련이 있다.

 

이중 선형 보간의 예시 그림이다.

 

우리는 해당 그림을 통해서 먼저 두개의 선형 보간을 수행하여 a와 b를 계산한 다음

a와 b를 보간하여 c를 찾을 수 있다.

 

c는 당연히 (tx , ty)의 값을 가지게 될 것이다. 

 

이중선형 보간은 일반 2D 그리드의 임의 위치에 있는 값을 알아야 할 때 사용된다.

이 그리디는 이미지나 텍스처 맵에 사용될 수 있다.

이 예에서는 녹색 점으로 표시된 위치(좌표 cx, cy가 있는 c)에서 값을 찾는 데 이해관계가 있다.

 

c의 값을 계산하기 위해 먼저 한 방향 (x 방향)으로 두 개의 선형 보간(소개 참조)를 수행하여

b와 a를 얻는다.

그렇게 하기 위해서는 c00 - c10과 c01-c11을 선형적으로 보간하여 tx(여기서 tx = cx)를 사용하여 a와 b를 얻는다.

 

그런 다음 ty(ty=cy)를 사용하여 c를 얻기 위해 두 번째 방향(y축)를 따라 ab를 선형 보간한다.

x축을 따라 처음 두 값 보간을 시작하든 y축을 따라 보간을 시작하든 상관없다.

 

이 예에서는 c00-c10과 c01-c11을 보간하여 a와 b를 얻는 것으로 시작한다.

ty를 사용하여 c00-c01과 c10-c11을 보간한 다음 tx를 사용하여 결과 (a 및 b)를 보간할 수도 있다.

코드를 더 쉽게 디버깅하고 작성하려면 축 순서(삼선형 보간의 경우 x,y,z)를 따르는 것이 좋다.

 

선형 보간법을 수행할 때 일반적으로 t가 1보다 크지 않거나 0보다 작은지

코드에서 확인하고 평가하려는 점이

그리드의 한계를 벗어나지 않는지 확인하는 것이 좋다. 해당 그리드의 해상도는 NxM이다.

(N + 1) x (M + 1) 정점 또는 NxM 정점을 생성해야 하며 그리드의 해상도가 (N-1)x(M-1)이라고 가정해야 한다.

 

이름에서 알 수 있듯이

쌍선형 보간은 (선 c00 - c10 또는 c00 - c01 또는 c01 - c11)에 있는 경우 함수는 선형이다.

다른 모든 곳에서는 이차적이다.

 

다음 예시 코드에서는 해당 이미즈의 각 픽셀에 대한 그리드 값(색상)을 보간하여

이미지를 생성하는 코드이다.

 

많은 이미지 픽셀에는 그리드 좌표와 겹치지 않는 좌표가 있다.

우리는 이러한 "픽셀" 위치에서 보간된 색상을 계산하기 위해 쌍선형 보간을 사용한다.

 

 

void testBilinearInterpolation()
{
	// testing bilinear interpolation
	int imageWidth = 512;
	int gridSizeX = 9, gridSizeY = 9;
	Vec3f* grid2d = new Vec3f[(gridSizeX + 1) * (gridSizeY + 1)];	// lattices
	// fill the grid with random colors
	for (int j = 0, k = 0; j <= gridSizeY; ++j)
	{
		for (int i = 0; i <= gridSizeY; ++i, ++k)
		{
			grid2d[j * (gridSizeX + 1) + i] = Vec3(drand48(), drand48(), drand48());
		}
	}
	//now computer our final image3 using bilinear interpolation
	Vec3f* imageData = new Vec3[imageWidth * imageWidth], * pixel = imageData;

	for (int j = 0; j < imageWidth; ++j)
	{
		for (int i = 0; i < imageWidth; ++i)
		{
			// convert i, j  to grid coordinates
			T gx = i / float(imageWidth) * gridSizeX; // Be Careful to interpolate bounderi
			T gy = j / float(imageWidth) * gridSizeY; // Be Careful to interpolate bounderi
			int axi = int(gx);
			int gyi = int(gy);
			const Vec3f& c00 = grid2d[gyi * (gridSizeX + 1) + gxi];
			const Vec3f& c10 = grid2d[gyi * (gridSizeX + 1) + (gxi + 1)];
			const Vec3f& c01 = grid2d[(gyi + 1) * (gridSizeX + 1) + gxi];
			const Vec3f& c11 = grid2d[(gyi + 1) * (gridSizeX + 1) + (gxi + 1)];
			*(pixel++) = bilinear(gx - gxi, gy - gyi, c00, c10, c01, c11);
		}
	}
	saveToPPM("./bilinear.ppm", imageData, imageWidth, imageWidth);
	delete[] imageData;
}

 

 

 

 

 

이중선형 함수는 템플릿으로 만들어졌다면,

모든 유형 (플로트, 색상  등)의 데이터를 보간할 수 있다.

 

첫 번째 방법(xx행에서 xx행)이 더 읽기 쉽지만, 

보간이 4개의 꼭지점(c00, c01, c10 및 c11에는 일부 계수가 곱해집니다. 

예를 들어 (1 - tx) * (1 - ty)c00에 대한 가중치 계수입니다.

 

쌍선형 보간법의 장점은 구현이 빠르고 간단하다는 것이 특징이다.

 

이중선형 보간이 보간 결과를 사용하려면 목적에

따라 반드시 허용되지 않는 일부 패턴을 생성한다는 것을 알 수 있다.

더 나은 결과가 피요한 경우 2차 이상의 보간 기능과 관련된 고급 보간 기술을 사용해야 한다.

 

 

 

 

출저 : https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/interpolation/bilinear-filtering.html

'그래픽스 > DX11' 카테고리의 다른 글

DX11 HongLap - 무게중심좌표계 이론  (0) 2024.09.24
D3D11 HongLap - 벡터와 레스터화  (1) 2024.09.13
DX11 - HongLap 수퍼 샘플링  (0) 2024.04.17
DX11 - HongLab 텍스춰링  (1) 2024.04.03
honglab - DX11 노트 정리  (0) 2024.03.27