2013-04-08 5 views
0

저는 컴퓨터 그래픽에서 XNA와 컬러 이론을 잘 아는 사람들을 위해 빠른 질문을 가지고 있습니다. 나는 타일 게임 (Terraria와 같은 것)을 만들고 있는데, 나는 타일 당 조명을 장면에 적용하는 방법을 궁금해하고 있었다. 이 게임에서는 컬러 조명이 필수이며, 지금 당장 4 차원 2D 배열을 사용하여 전반적인 조명과 3 가지 색상 양을 저장함으로써 그 점을 알게되었습니다. 타일을 그릴 때 특정 타일의 텍스처를 사용하지만 3 색 값과 전반적인 조명을 기반으로 동일한 타일에서 색상을 적용하려면 어떻게해야합니까?XNA에서 2D 타일 맵을 조명하십시오.

는 지금이 내 컬러 발생 기능입니다 : 내가 전혀 올바른 방법으로 이것에 대해 갈거야 경우 색상 이론에서 새로운 인

public Color GetColorAt(int x, int y) 
{ 
    byte r = _rMap[x, y]; //Red light 
    byte g = _gMap[x, y]; //Green light 
    byte b = _bMap[x, y]; //Blue light 
    byte mul = _lightMap[x, y]; ///Overall light 

    return new Color(r * mul, g * mul, b * mul, 1); 
} 

, 나는 아무 생각이 없습니다. 내 조명 시스템은 셀룰러 알고리즘을 사용하여 인접한 모든 타일로 줄이고 퍼집니다. 각 타일의 색상 값이 감소하면 전반적인 광원 값이 필요합니까?

또한 타일 텍스처와 빛을 블렌딩하여 결과를 얻으려면 더하기 또는 곱하기 또는 다른 계산을 사용합니까?

TL : 1. 위의 코드 블록은 각 타일 사이의 빛이 감소한다고 생각합니까? 2. 빛과 텍스처를 결합하여 빛의 색상 아래에있는 텍스처를 얻으려면 어떻게해야합니까?

어떤 도움을 주셔서 감사합니다. 색상 결합에 대한 경험이 없습니다.

+0

이 질문을하기 전에 수행 한 연구는 무엇입니까? – Sebivor

답변

0

아마도 전체/다중 값이 필요하지 않을 것입니다. R, G 및 B는 밝은 색상 및 강도를 나타내는 데 충분합니다.

"byte"를 사용하고 있지만 0.0 ~ 1.0 범위의 "float"값을 사용하는 것이 수학적으로 더 쉽습니다. 플로트 표현

, R=1, G=1, B=1R=0, G=0, B=0가 및 0..255 바이트 범위로 변환하여 소란 않고도 다음 방금 직접 색상을 곱할 수 등, 흑색, R=0.5, G=0.5, B=0.5 중간 회색, 흰색이다.

타일을 그릴 때 SpriteBatch의 색상 매개 변수를 사용할 수 있습니다. 기본적으로 밝은 색상으로 설정하고 타일을 그릴 때 색상 승수를 자동으로 수행해야합니다. 조명 셀을 Terraria와 같이 타일보다 작게하려면 사용자 정의 쉐이더를 작성해야합니다.이 쉐이더는 좀 더 복잡합니다. 그러나 일부 공부할 때 유용합니다.

+0

내 질문에 답해 주셔서 감사합니다. 나에게는 mul 가치가 필요하지 않을지도 모르는 암시가 있었다. 그리고 나의 친구 중의 1 명에게 묻고 난 후에, 그녀는 내가 그것을 필요로한다라고 생각하지 않는다고 말했다. 그러나 확실하지 않았다. – sm81095

+0

Terraria와 같이 블록 당 여러 개의 조명 타일에 관해서는 쉐이더에 익숙하지 않으므로 인터넷을 둘러 볼 것입니다. – sm81095