UDN
Search public documentation:

LightFunctionsKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 빛과 그림자 > 라이트 함수

라이트 함수


문서 변경내역: James Tan 작성. 홍성진 번역.

개요


라이트 함수는 언리얼 엔진 3 에서 라이트가 씬을 어떻게 밝힐 것인가를 수학적으로 나타내는 것입니다. 라이트는 디폴트로 라이트 컴포넌트가 정의하는 여러가지 인풋, 이를테면 밝기나 색 같은 것에 따른 상수 값을 사용합니다. 라이트 함수를 통해 깜빡이는 빛이나 마스킹을 적용한 빛, 스트로브 라이트(나이트클럽의 번쩍이는 빛), 텍스처를 입힌 빛과 같은 재미난 효과를 낼 수 있습니다. 라이트 함수는 언리얼 엔진 3 의 머티리얼 시스템을 사용하므로, 아티스트와 레벨 디자이너도 쉽게 만들고 수정할 수 있습니다. 또한 머티리얼 시스템을 사용하기에 이러한 라이트 함수를 인스턴싱하여 변종(variation)을 만들 수도 있습니다.

LightFunctionsScreenShot.jpg

데칼 vs 라이트 함수

알아둬야 할 중요한 점 한 가지는, 라이트 함수도 여전히 라이트이기에, 오브젝트 위에 빛과 함께 텍스처도 비춰(project) 주고 싶다면 라이트 함수가 훨씬 낫다는 점입니다. 라이트 함수는 데칼이 할 수 없는 텍스처 큐브도 비출 수 있습니다. 그렇기에 뭔가가 빛을 비출 것인가 말 것인가는 결정적 요인이 되지 않습니다.

사용할 수 있는 머티리얼 표현식


라이트 함수와 모든 머티리얼 표현식을 사용할 수 있는 것은 아닙니다. 그 이유는 일부 표현식은 라이트 함수와 잘 어울리지 않기 때문입니다만, 대부분의 표현식을 사용할 수는 있습니다. 수학적이거나 텍스처 샘플러 표현식은 모두 돌아가지만, 다른 렌더 타겟이나 메시 프로퍼티 의존적인 것들은 무시됩니다. 어떠한 표현식이 있고, 그 작동방식은 어떠한지 Materials Compendium KR 페이지에서 참고해 보시기 바랍니다.

Texture 2D

2차원 텍스처를 사용할 수는 있지만, 디렉셔널 라이트나 스포트 라이트처럼 일정한 방향으로 뻗어가는 라이트에 적합합니다. 스포트 라이트에도 사용할 수는 있지만, 텍스처 띠 현상(banding)이 일어납니다. 디렉셔널 라이트도 수직 표면 근처에서는 텍스처 밴딩 현상이 일어납니다.

텍스처 입힌 라이트 함수와 포인트 라이트입니다. 천정과 바닥에 텍스처 띠 현상이 보입니다.

LightFunctions_PointLightTexture2D.jpg

텍스처 입힌 라이트 함수와 스포트 라이트입니다. 표면 일부만 빛을 받기에, 텍스처 띠 현상이 거의 없습니다.

LightFunctions_SpotLightTexture2D.jpg

텍스처 입힌 라이트 함수와 디렉셔널 라이트입니다. 벽 일부처럼 수직 표면 근처에 텍스처 띠 현상이 보입니다.

LightFunctions_DirectionalLightTexture2D.jpg

텍스처 큐브

큐브 매핑에 텍스처 큐브가 사용됩니다. 큐브 매핑은 배경 매핑의 한 방법으로, 각각의 텍스처가 큐브의 한 면을 정의하는 식입니다. 이 경우 큐브 매핑은 라이트 함수에서 사용될 때 비출 수 있는 텍스처 매핑을 만들어 냅니다.

텍스처 큐브를 입힌 라이트 함수와 포인트 라이트입니다. 티나는 텍스처 띠 현상은 없습니다.

LightFunctions_PointLightTextureCube.jpg

텍스처 큐브를 입힌 라이트 함수와 스포트 라이트입니다. 티나는 텍스처 띠 현상은 없습니다.

LightFunctions_SpotLightTextureCube.jpg

텍스처 큐브를 입힌 라이트 함수와 디렉셔널 라이트입니다. 티나는 텍스처 띠 현상은 없습니다.

LightFunctions_DirectionalLightTextureCube.jpg

그렇다고 항상 큐브 맵을 사용해야 한다는 소리일까요? 그 답은 어떤 식으로 비춰줄 것인가, 씬에 어떻게 영향을 끼칠 것인가에 달려 있습니다. 큐브 맵은 이음새를 만들지 않는 텍스처 세트에 매우 의존적입니다. 머티리얼 안에서 텍스처 큐브를 패닝/로테이팅 하기가 어렵기도 합니다.

텍스처 큐브 입힌 라이트 함수 로테이트 방법

가장 쉬운 방법은 그냥 라이트 액터를 로테이트 하는 것입니다. 머티리얼에 사용된 라이트 벡터도 라이트 액터의 로테이션 값에 맞게 조절됩니다.

LightFunctions_RotatingLightFunction.jpg

참고

라이트 함수는 라이트 컴포넌트로 설정되는 라이트의 최대 밝기를 지정할 수 없습니다. 라이트 함수는 라이트의 최종 밝기를 조절하는 스케일에 더 가깝습니다.

라이트 함수가 색을 출력할 수는 있지만, 라이트 컴포넌트 자체가 하얀색을 사용하지 않는 이상 라이트 함수 색을 구하지는(evaluate) 않습니다. 컬러 텍스처를 사용하는 라이트 함수를 조절하려면 Desaturate 머티리얼 표현식을 사용하면 됩니다.

사용할 수 있는 라이트 타입


스카이 라이트가 지원되지 않기는 하지만, 스카이 라이트야 단지 도처의 배경 빛을 나타낼 뿐이니 문제는 없습니다. 라이트는 도미넌트, 무버블, 토글러블 등이 가능하며, 필요에 따라 다이내믹 섀도우를 드리워도 됩니다. 스태틱 라이트에 대해서는 더이상 라이트 함수를 만들 수 없습니다. 부적절한 라이트가 선택된 경우 언리얼 에디터가 라이트 함수를 만들지 못합니다.

언리얼 에디터 라이트 함수 튜토리얼


라이트 함수 만들기

라이트 함수를 새로 만들려면 우선 콘텐츠 브라우저에서 머티리얼을 새로 만듭니다. 머티리얼을 저장할 패키지와 그룹을 (, 라이트 함수가 레벨 전용이라면 레벨로) 정해 주고, 이 라이트 함수를 뭐라 부를 것인지 정해 줍니다.

LightFunctions_0_CreateNewMaterial.jpg

언리얼 엔진 3 에게 머티리얼을 라이트 함수로 인식시켜 주려면, 머티리얼의 프로퍼티에 명시적으로 설정해 줘야 합니다. Mutually Exclusive Usage 범주에서 Used As Light Function 를 체크해 주면 됩니다.

LightFunctions_1_SetUsedAsLightFunction.jpg

아래처럼 단순한 라이트 함수를 만듭니다. 이 라이트 함수는 단순히 라이트를 어두웠다 밝았다 부드럽게 보간시키는 것입니다.

LightFunctions_2_SimpleLightFunction.jpg

머티리얼 에디터를 닫고 예를 눌러 머티리얼을 저장합니다. 그리고 패키지를 저장합니다.

라이트 함수를 라이트로 추가하기

먼저 적합한 종류의 라이트인지 확인해야 합니다. 라이트 액터에 우클릭하고 맥락 메뉴를 통해 종류를 전환할 수 있습니다. 라이트 함수에 쓸 수 있는 종류는 Dominant, Movable, Toggle-able 입니다.

LightFunctions_ConvertLight.jpg

라이트 액터의 프로퍼티를 엽니다. Light 범주를 펼치고 Light Component 오브젝트를 엽니다. Light Component 오브젝트 안에서 Light Component 범주를 펼칩니다.

LightFunctions_3_ExpandCategories.jpg

Light Function 필드 옆의 파랑 화살표를 클릭하면 나타나는 멕락 메뉴에서 Light Function 를 클릭합니다. 그러면 Light Function 오브젝트가 새로 생깁니다.

LightFunctions_4_CreateNewLightFunction.jpg

Light Function 오브젝트를 펼치고 방금 만든 라이트 함수를 선택한 다음 녹색 화살표를 클릭하여 라이트 함수 오브젝트의 Source Material 필드를 채웁니다. 텍스처를 사용하는 라이트 함수를 사용중이라면 여기서 프로젝션 스케일을 조절해 줄 수도 있습니다.

LightFunctions_5_LightFunctionSet.jpg

라이트 함수 프로퍼티

  • Source Material 소스 머티리얼 - 라이트 함수에 사용할 머티리얼입니다.
  • Scale 스케일 -
    • X - X 축의 프로젝션 스케일을 조절합니다.
    • Y - Y 축의 프로젝션 스케일을 조절합니다.
    • Z - Z 축의 프로젝션 스케일을 조절합니다.
  • Disabled Brightness 꺼진 밝기 - 라이트 함수를 지정했으나 꺼졌을 때 라이트에 적용할 밝기 인수입니다. 예를 들면 SceneCapView_LitNoShadows 를 사용하는 씬 캡처에서 입니다. 라이트 함수의 이미시브 인풋 평균 밝기로, 0.f 에서 1.f 범위로 설정해야 합니다.

언리얼스크립트 라이트 함수 튜토리얼


임베디드 라이트 함수

라이트 함수는 언리얼스크립트의 default properties 섹션에서 만들 수 있습니다. 언리얼스크립트로 라이트 함수를 만들면 생성된 라이트 함수를 붙인 라이트 컴포넌트에 끼워넣을(embed) 수 있습니다. 실행시간에 라이트를 스폰하고 자동으로 라이트 함수를 갖도록 만들려는 경우에 좋습니다. 언리얼 에디터에서 라이트 함수로 구성된 라이트 아키타입을 만드는 식으로도 가능합니다.

EmbeddedLightFunctionLight.uc
class EmbeddedLightFunctionLight extends PointLightMovable;

defaultproperties
{
  // 스크립트로 라이트 함수를 만듭니다.
  Begin Object Class=LightFunction Name=MyLightFunction
    SourceMaterial=Material'LightFunctionAssets.SimpleFlickeringLightFunction'
  End Object

  // 라이트 컴포넌트에 라이트 함수를 붙입니다.
  Begin Object Name=PointLightComponent0
    Function=MyLightFunction
  End Object

  bNoDelete=false
}

스크립트 컴파일을 마치면 콘텐츠 브라우저 내 액터 클래스 브라우저에서 이 함수를 찾을 수 있습니다.

LightFunctionsFindingEmbeddedLightFunctionLight.jpg

동적으로 생성되는 라이트에 라이트 함수 추가하기

라이트 함수는 이미 레벨에 있으면서 동적인 라이트, 또는 게임에서 스폰된 라이트에 추가할 수도 있습니다. 유일하게 안좋은 점이라면, 라이트 함수는 그 머티리얼 리퍼런스를 상수로 선언한다는 점인데, 현재 언리얼스크립트로는 이것을 어찌 할 수 있는 방법이 없습니다. 그때문에 언리얼 에디터 안에서 라이트 함수를 아키타입으로 만드는 것이 좋습니다. 그런 다음 아키타입을 기반으로 하여 새로운 라이트 함수를 스폰하고서, 실행시간에 그것을 라이트 컴포넌트에 할당하는 것입니다.

RunTimeLightFunctionLight
class RunTimeLightFunctionLight extends PointLightMovable;

var(Light) const archetype LightFunction LightFunctionArchetype;

function PostBeginPlay()
{
  local PointLightComponent PointLightComponent;
  local LightFunction LightFunction;

  Super.PostBeginPlay();

  PointLightComponent = PointLightComponent(LightComponent);
  if (PointLightComponent != None)
  {
    if (LightFunctionArchetype != None && LightComponent.Function == None)
    {
      LightFunction = new () LightFunctionArchetype.Class(LightFunctionArchetype);
      if (LightFunction != None)
      {
        LightComponent.SetLightProperties(,, LightFunction);
      }
    }

    PointLightComponent.UpdateColorAndBrightness();
  }
}

defaultproperties
{
  bNoDelete=false
}

라이트 함수 아키타입을 만들려면 콘텐츠 브라우저 내 액터 클래스 브라우저로 갑니다. LightFunction 을 찾은 다음 그 위에 우클릭하고 "아키타입 생성" 을 클릭합니다.

0_LightFunctionCreateLFArchetype.jpg

팝업이 뜨는데, 여기서 아키타입을 저장할 곳을 설정합니다. RunTimeLightFunctionLight 클래스에 대해 위 과정을 반복합니다.

1_LightFunctionSetLFLocation.jpg

콘텐츠 브라우저로 돌아가서 RunTimeLightFunctionLight 클래스에 더블클릭합니다. 미리 만들어 둔 LightFunction 아키타입으로 LightFunctionArchetype 프로퍼티 필드를 설정합니다.

2_LightFunctionCustomizeLightArchetype.jpg

아키타입으로 스폰할 수 있는 키즈멧 시퀸스 입니다. RunTimeLightFunctionLight 아키타입 스폰을 위한 구성입니다.

3_LightFunctionKismet.jpg

관련 토픽


다운로드