2013-05-21 2 views
0

지형 생성을 위해 "뒤로"가고 있습니다. 나는 지형과 그 법선을 절차 적으로 생성하고 있습니다. 그런 다음 2D 맵으로 사용할 지형의 비트 맵을 생성합니다. 이것은 모두 올바르게 작동하고 내가 원하는 결과를 생성합니다. 하지만 지금은 2D지도에 "평평한"음영이 있습니다 - 어떻게 지형의 생성 된 법선을 2D 생성 비트 맵에 적용 할 수 있습니까?생성 된 법선을 비트 맵에 어떻게 적용합니까?

"sun"이 직접 오버 헤드 ("정오") 인 것처럼 조명을 적용하고 싶습니다. 나는 일반적인 인터넷뿐만 아니라 이것과 다른 dev 사이트를 수색했지만, 나의 필요, 이론 및 개념 정보를 위해 특정한 것을 발견하지 못했다.

아무에게도이 작업을 수행하거나 올바른 방향으로 나를 가리켜 줄 수 있습니까? 코드를 제공 할 필요는 없습니다 (의사 코드가 좋을지라도).하지만 어디에서 시작해야하는지에 대한 아이디어가 필요합니다. 내 게임에는 C#/XNA를 사용하지만 모든 언어의 아이디어를 환영합니다.

답변

2

당신이 시도하는 것은 범프 맵을 만드는 것입니다.

http://www.gutgames.com/post/Normal-Map-Creation-Using-C.aspx

그것은 보통은 항상 (보통 얼굴에 수직) 특정 방향으로 가리키는 다음은 RGB 값을 기준으로 상쇄되어 가정합니다. 위의 링크를 포함하여 범프 맵을 다루는 많은 리소스가 있습니다.

간단한 작업을 원할 경우 새로운 비트 맵의 ​​RGB에 실제 표준 값을 저장할 수 있습니다 (이 방법으로 정밀도가 떨어짐에 유의하십시오). 당신의 범위 인 경우

[-1 ... 1] 다음 : 당신은 정상이 있다면 그래서 255

에 의해 다음 곱셈, 2하여 결과 및 분할에 1을 추가 (0, 1, 0)

0 + 1 = 2분의 1 = 0.5 * 255 = 128 = 새 X 값

1 + 1 = 2분의 2 = 1 * 255 = 255 = 새 Y 값

0 + 1 = 1/2 = 0.5 * 255 = 128 = 새로운 Z 값

그러면 비트 맵에 (128,255,128)을 저장합니다. 1 = 0 = 귀하의 옛 X 값

255분의 255 = 1 * 2 -

255분의 128 = 0.5 * 2 = 1 :

는이 과정을 반전 할 올바른 값으로 돌아가려면 = 1 - 2 = 1 = 내 이전 Y 값

255분의 128 = 0.5 * 2 = 1 - 1 = 0 = 내 이전 Z 값

정밀 열악하지만 충분히 잘 작동한다. X와 Y 당 2 바이트를 얻을 수 있도록 값을 팩 할 수도 있습니다. 따라서 RGBA 값의 X = RG 및 Y = BA입니다. 그런 다음 Z 값을 풀어 정상적인 상태가되도록 마술을 할 수 있습니다. 법선을 정규화하면 길이가 1이됩니다. 따라서 1 = sqrt (x * x + y * y + z * z). 비트 맵에서 X와 Y를 읽으면 Z를 해결할 수 있습니다. 정밀도가 크게 향상되고 필요에 따라 범프 매핑 정밀도를 향상시키는 데에도 사용할 수 있습니다.

+0

감사합니다. 정보와 링크! – tvwxyz

0

점 제품이 핵심입니다! :)

관심있는 사람들을 위해 내가 생각해 낸 해결책은 다음과 같습니다. 위의 의견에 감사드립니다.

https://stackoverflow.com/questions/3121815/what-are-the-dot-and-cross-product-of-vectors

http://www.tjhsst.edu/~dhyatt/supercomp/n310.html

// ====================== : 또한, 여기에 나를 크게 도움이 개 사이트입니다 ==================

// change location of lightPosition as desired 
// lightPosition Y may have to be positive for different implementations 
Vector3 lightPosition = new Vector3(0, -1, 0); 
lightPosition.Normalize(); // not needed for above but this assumes normalized 
float dotProduct = (Vector3.Dot(
    terrainPositionVector3Normalized, lightPosition) + 1) * 0.5f; 
terrainColor.R = (byte)((float)terrainColor.R * dotProduct); 
terrainColor.G = (byte)((float)terrainColor.G * dotProduct); 
terrainColor.B = (byte)((float)terrainColor.B * dotProduct); 
관련 문제