이런 건 어때?
타일 스프라이트를 착색하여 조명을 그리지 마십시오. 당신의 그리기 꺼져 , 렌더링 타겟 타일을 한 후 타일의 지역을 커버 그레이 스케일 사각형 각 하나를 나타내는 두 번째 렌더 타겟에 타일 등을 그립니다. 최종 장면을 렌더링하려면 셰이더를 사용하여 두 렌더링 대상을 결합하여 두 번째 값에 따라 첫 번째 픽셀을 어둡게합니다.
이것은 당신이 지금 가진 것을 정확하게 생산할 것입니다. 그것은 당신에게 도움이되지 않으므로 조금 변경합시다.
각 타일 이 직사각형 영역이 아닌 단일 픽셀로 표시 되도록 라이트 맵 렌더 대상의 크기를 변경하십시오 . 최종 장면을 합성 할 때는 선형 필터링과 함께 샘플러 상태를 사용하십시오. 그렇지 않으면 다른 모든 것을 그대로 두십시오.
셰이더를 올바르게 작성했다고 가정하면 합성 중에 라이트 맵이 효과적으로 "확대"되어야합니다. 그래픽 장치의 텍스처 샘플러를 통해 멋진 그라디언트 효과를 무료로 얻을 수 있습니다.
셰이더를 잘라 내고 '어두워 진'BlendState를 사용하여이 작업을 더 간단하게 수행 할 수도 있지만, 구체적으로 설명하기 전에 실험해야합니다.
최신 정보
나는 오늘 이것을 실제로 조롱 할 시간이 있었다. 위의 답변은 모든 것에 대한 첫 번째 답변으로 쉐이더를 사용하는 습관을 반영하지만이 경우 실제로 필요하지 않으며 사용이 불필요하게 복잡합니다.
내가 제안했듯이, 사용자 정의 BlendState를 사용하여 정확히 동일한 효과를 얻을 수 있습니다. 구체적으로,이 커스텀 BlendState는 :
BlendState Multiply = new BlendState()
{
AlphaSourceBlend = Blend.DestinationAlpha,
AlphaDestinationBlend = Blend.Zero,
AlphaBlendFunction = BlendFunction.Add,
ColorSourceBlend = Blend.DestinationColor,
ColorDestinationBlend = Blend.Zero,
ColorBlendFunction = BlendFunction.Add
};
블렌딩 방정식은
result = (source * sourceBlendFactor) blendFunction (dest * destBlendFactor)
커스텀 BlendState를 사용하면
result = (lightmapColor * destinationColor) + (0)
즉, 순수한 흰색 (1, 1, 1, 1)의 원본 색상은 대상 색상을 보존하고, 순수한 검정색 (0, 0, 0, 1)의 원본 색상은 대상 색상을 순수한 검정색으로 어둡게합니다. 중간에 회색 음영이 있으면 대상 색상이 중간 정도 어두워집니다.
이것을 실제로 적용하려면 먼저 라이트 맵을 만들기 위해 필요한 모든 작업을 수행하십시오.
var lightmap = GetLightmapRenderTarget();
그런 다음 평소와 같이 조명이없는 장면을 백 버퍼로 직접 그립니다 .
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
/* draw the world here */
spriteBatch.End();
그런 다음 커스텀 BlendState를 사용하여 라이트 맵을 그립니다 :
var offsetX = 0; // you'll need to set these values to whatever offset is necessary
var offsetY = 0; // to align the lightmap with the map tiles currently being drawn
var width = lightmapWidthInTiles * tileWidth;
var height = lightmapHeightInTiles * tileHeight;
spriteBatch.Begin(SpriteSortMode.Immediate, Multiply);
spriteBatch.Draw(lightmap, new Rectangle(offsetX, offsetY, width, height), Color.White);
spriteBatch.End();
그러면 대상 색상 (조명 타일)에 소스 색상 (라이트 맵)이 곱 해져서 조명이없는 타일이 적절하게 어두워지고 라이트 맵 텍스처가 필요한 크기로 조정되어 그라디언트 효과가 생성됩니다.