[Unity]유니티 입문 - Light

·2022년 12월 26일
0

Unity

목록 보기
6/8
post-thumbnail

케이디님의 유니티 입문 강좌를 듣고 정리한 내용입니다.

Light

씬에서 필수적인 광원은 3D 환경의 컬러와 분위기를 정의한다. 비쥬얼 퀄리티를 높이는 가장 효과적인 방법이다.

Light setting Property

  • Type : 광원의 종류.

    • Spot : 특정한 위치와 범위로 빛을 보냄. 각도를 조절하여 원뿔 모양의 영역으로 빛을 조절할 수 있다. 또한 가장자리로 갈수록 광도는 약해지며 각도를 넓히면 '페넘브라'라고 하는 fade의 크기도 함께 커진다. (자동차 헤드라이트와 같음)
    • Directional : 전 범위에 걸쳐서 동일한 세기와 각도로 빛을 보냄. 라이트 오브젝트를 씬의 아무 위치에나 배치해도 된다. (태양과 같음)
    • Point : 광원의 모든 방향으로 균등하게 빛을 보낸다. 광도는 광원에서 멀어질수록 약해지고, 지정된 거리에서 0이된다. (전구와 같음)
    • Area(baked only) : 면 광원으로 모양을 정할 수 있으면 면의 한쪽에서 빛을 방출한다. 빛의 강도는 광원으로부터 거리의 역제곱 비율로 감소한다. 연산량이 많아 런타임으로는 사용 불가. 다른 광원 타입에 비해 셰이딩이 더 부드럽고 섬세.(TV 화면 같음)
  • Color : 광원의 색

  • Mode : 광원 연산 모드.

    • Baked: 런타임 전에 저장된 광원에서 조명을 미리 계산하고, 디스크에 조명 데이터로 저장. 그림자의 렌더링 부하를 낮춘다.
    • Realtime: 런타임 시점에 매 프레임마다 실시간 광원의 조명을 계산하고 업데이트.
    • Mixed : Baked + Realtime 혼합 광원
  • Intensity : 광원의 세기.

  • Indirect Multiplier : 간접광의 세기. 1보다 낮은 값으로 설정하면 반사광이 반사될 때마다 점점 어두워지고, 1보다 높은 값으로 설정하면 반사될 때마다 빛이 더 밝아진다.

  • Cookie : 빛을 방해하는 텍스처. (구름 같은)

  • Draw Halo : 후광.

  • Flare : 광원을 바라보면 보이는 렌즈 플레어.

  • Render Mode : 광원의 렌더링 우선 순위 설정.

  • Culling Mask : 선별적으로 오브젝트 그룹을 광원의 영향에서 제외.

Shadows

  • Shadow Type : 그림자 종류. No, Hard, Soft 세 가지가 있다.

  • Strength : 그림자 세기. 0~1 이며 기본값은 1이다.

  • Resolution : 그림자 해상도. 높을수록 정확하다.

  • Bias : 그림자를 밀어냄. 버그 체크 용

  • Normal Bias : 그림자를 축소시킴. 버그 체크 용

  • Near Plane : 그림자를 렌더링할 때의 전방 절단면(near clip plane) 값을 설정

Window > Rendering > Lighting 에 들어가면 더 자세하게 설정할 수 있다.

Code

고장난 전구처럼 깜박깜박 거리는 광원을 만드는 스크립트이다. Light type은 Spot나 Point로 해야한다.

public class Test7 : MonoBehaviour
{
    private Light theLight;
    private float targetIntensity;
    private float currentIntensity;
    void Start()
    {
        theLight = GetComponent<Light>();
        currentIntensity = theLight.intensity;
        //목표 광원 강도
        targetIntensity = Random.Range(0.4f, 1f);
    }

    // Update is called once per frame
    void Update()
    {   // 타겟과 현재 값의 차이가 0.01보다 크면
        if (Mathf.Abs(targetIntensity - currentIntensity) >= 0.01)
        {
            if (targetIntensity - currentIntensity >= 0)
            {   // 현재 강도를 크게
                currentIntensity += Time.deltaTime * 3f;
            }
            else
            {   //현재 값을 작게 
                currentIntensity -= Time.deltaTime * 3f;
            }
            // 값을 light 컴포넌트의 intensity값으로 넣기
            theLight.intensity = currentIntensity;
            // range도 증가
            theLight.range = currentIntensity+10;
        }
        else
        {
            targetIntensity = Random.Range(0.4f, 1f);
        }
    }
}
profile
중요한 건 꺾여도 다시 일어서는 마음

0개의 댓글