주변에서 파티클을 빛나고 빛을 내려면 어떻게해야합니까?


22

현재 어두운 숲에서 반딧불 효과를 만들려고합니다. 레벨은 매우 낮은 조명을 가지고 있으며 플레이어는 몇 안되는 광원 중 하나입니다. 플레이어가 레벨을 더 잘 볼 수 있도록 맵에 무작위로 반딧불이 나타나도록 시도하고 있습니다. 한 가지 방법은 파티클 시스템을 사용하는 것입니다. 그러나 나는 입자들이 주변 환경에 빛을 비추도록 할 수 없다. 이것을 할 수있는 방법이 있습니까?


3
여기서 중요한 문제는 "빛이 비싸다"는 것입니다. 영역을 충분히 비추는 고정 소수점 라이트를 배치하고 라이트 맵에 라이트를 굽은 다음 입자를 사용하여 수십 개의 엄청나게 비싼 동적 라이트를 사용하는 대신 광원이 어디에서 나오는지 설명하는 것이 좋습니다.
Draco18s

@ Draco18s 수십 개의 반딧불이 없을 것입니다. 그들은 오직 플레이어의 시야 안에 나타날 것입니다. 하향식이며 제어하기 쉽습니다. 그리고 주어진 시간에 반딧불이 10 개 미만이어야합니다. 동적 포인트 라이트 10 개가 비싸다고 생각하지 않습니까?
DarkDestry

기본적으로 Unity에서는 한 번에 2 개의 활성 동적 조명 만 형상을 비출 수 있습니다 (2D 설정에서는 다를 수 있음). 물론 이것을 늘릴 수는 있지만 +1 라이트는 드로우 콜에 x2 영향을 미칩니다.
Draco18s

2
Draco18s @이 포워드 렌더링 경로의 사실 일 수 있지만, 해당 문서에 명시된 바와 같이 "이연 음영을 사용하는 경우가없는 등의 수에는 제한 객체에 영향을 미칠 수있다"-의 작은 부분에 영향을 미치는 많은 작은 조명 화면은 정확히 유스 케이스 지연 렌더링 경로가 효율적으로 처리하는 데 탁월합니다. (정방향 렌더링과 마찬가지로 승수 대신 고유 한 조명 당 하나의 드로우 콜 비용이 발생 함)
DMGregory

그건 좋은 지적이야. 대부분의 다른 렌더링 경로를 잊어 버렸습니다.
Draco18s

답변:


7

발광 입자는 이제 5.5에 내장 된 Unity 기능입니다.

파티클 인스펙터에서 라이트를 활성화하고 라이트 프리 팹에 대한 참조를 던지고 (점 및 스폿 라이트가 작동 함) 비율을 1로 변경하십시오.

여기에 이미지 설명을 입력하십시오

그리고 빛을 발하는 입자들 : ! [여기에 이미지 설명 입력

이것은 수백의 최대 조명으로도 내 장비에서 1500 + fps로 실행되는 다소 최적화 된 설정입니다.

편집 : 약간의 관찰 후에 입자 조명이 조각 조명과 정점 조명 사이에서 전환되는 것으로 보입니다 (아마도 최적화를 위해?). 최대 조명이 너무 높게 설정된 경우 소량의 시각적 인공물이 생성 될 수 있습니다.

Edit2 : DMGregory에서 지적한 것처럼 아티팩트는 순방향 렌더링 최적화의 부산물입니다. 지연된 조명이 문제를 해결합니다. nicer gif 추가


1
좋은 소식입니다! :)이 답변은 새로운 파티클 시스템 기능으로 설정하는 방법에 대한 단계별 지침이 포함되어 있으면 더 좋습니다.
DMGregory

1
보이는 버텍스 라이팅 비헤이비어는 Unity가 포워드 렌더링에 적용하는 최적화 중 일부와 비슷합니다. 지연된 경로를 사용할 때 동일한 동작이 보입니까?
DMGregory

네가 옳아! 지연 렌더링 경로를 사용할 때 아티팩트가 더 이상 존재하지 않습니다.
eclmist

31

헤즈 업 :

이 답변은 구식입니다. 유니티는 이제 포인트 라이트 파티클을 기본적으로 지원합니다. 자세한 내용은 이 답변 을 참조 하십시오.

궁금한 점이 있거나 이전 버전의 Unity를 사용하거나 기본 메소드가 제공하는 것보다 더 많은 수동 제어가 필요한 사용자를 위해 여기에 게시하겠습니다. 기본 지원은 아래 제시된 방법보다 훨씬 효율적이고 확장 가능합니다.


왜 그렇게 많은 답변이 이것이 어렵거나 불가능하다고 주장하는지 잘 모르겠습니다. 수십 개의 다이나믹 포인트 라이트를 처리하는 것은 PC에서 실행 되는 최신 지연 렌더링 파이프 라인 에서 매우 일반적입니다 .

내가 요리 한 빠른 예는 다음과 같습니다. 조명이있는 반딧불의 예

이 스크립트를 사용하여 최대 파티클에 충분한 조명을 동적으로 스폰합니다 (최대 값이 적당하도록 파티클 시스템 설정을 조정하십시오-기본값은 1000으로 설정하면 그래픽 카드가 매우 만족스럽지 않습니다). 입자 :

[RequireComponent(typeof(ParticleSystem))]
public class ParticleLights : MonoBehaviour {

    public Light lightPrefab;

    ParticleSystem _system;
    ParticleSystem.Particle[] _particles;
    Light[] _lights;


    void Start () {
        _system = GetComponent<ParticleSystem>();
        _particles = new ParticleSystem.Particle[_system.maxParticles];

        _lights = new Light[_system.maxParticles];
        for(int i = 0; i < _lights.Length; i++)
        {
            _lights[i] = (Light)Instantiate(lightPrefab);
            _lights[i].transform.parent = transform;
        }
    }

    void Update () {

        int count = _system.GetParticles(_particles);
        for(int i = 0; i < count; i++)
        {
            _lights[i].gameObject.SetActive(true);
            _lights[i].transform.localPosition = _particles[i].position;

            // Looks like the GetCurrentColor function was added in 5.3.
            // You can use other methods in earlier Unity versions.
            _lights[i].color = _particles[i].GetCurrentColor(_system);
        }

        for (int i = count; i < _particles.Length; i++)
        {
            _lights[i].gameObject.SetActive(false);
        }
    }
}

편집 : 먼저 게임 오브젝트 (이 경우 Create- > Light-> Point Light)를 생성하고 원하는 이름 / 매개 변수 / 스크립트 / 어린이로 설정 한 다음이를 계층에서 드래그 하여 프리 팹 을 생성 할 수 있습니다 프로젝트 탐색기. 이를 통해 오브젝트를 여러 장면 및 스크립트에서 재사용 할 수있는 자산으로 저장합니다. 장면에서 사본을 삭제할 수 있으며 자산은 필요할 때 참조 할 수 있도록 자산 폴더에 남아 있습니다.

lightPrefab의 범위가 비교적 작고 섀도우 캐스트가 아닌지 확인하여 장면에서 일어나는 모든 작업을위한 최고의 성능 헤드 룸을 제공하십시오. lightPrefab 자체를 녹색 (또는 반딧불의 색)으로 만들 필요는 없습니다. 파티클의 색에서 가져옵니다.

당신이 설득력있는 방황을 얻는 것보다 입자 시스템 예술가가 더 많기 때문에 광고판 쿼드 및 사용자 정의 이동 / 깜박임 스크립트가 부착 된 조명을 사용하여 각각 하나의 게임 오브젝트를 만들면 반딧불 비행을보다 잘 제어 할 수 있음을 알 수 있습니다 알아. ;)


실제로 ... 반딧불에 그림자 투사를 사용하지 않겠다고 말했지만 예제 장면에서 켜려고 시도했지만 아무런 문제가 발생하지 않았습니다. 반딧불이 물체를 지나갈 때 그림자가 돌아가는 방식은 정말 시원하며 무시 무시한 분위기를 더할 수 있습니다. 마일리지는 장면과 대상 하드웨어의 복잡성에 따라 다를 수 있으므로 프로파일은 확실하지만 내 부분이 조기에 최적화 된 경우 일 수 있습니다. :)
DMGregory

라이트 프리 팹은 어떻게 만드나요?
DarkDestry

또한 어떤 이유로 ParticleSystem.Particle은 레거시 입자를 나타냅니다. GetCurrentColor 또는 GetCurrentSize 메서드가 없습니다.
DarkDestry

@DarkDestry 프리 팹을 만드는 것에 대한 답변에 메모를 추가했습니다. 누락 된 기능에 관해서는 버전 문제 일 수 있습니다-5.3에서 일하고 있습니다. 이전 버전의 Unity에서는 다른 방법으로 할 수 있습니다. Hamza Hasan이 친절하게 만든 방을 사용하여 chat에서 구현 세부 사항에 대해 논의 해 봅시다 .
DMGregory

따라서 가벼운 프리 팹은 일반 프리 팹과 동일합니다. 가벼운 조립식으로 언급되었을 때 혼란스러워했습니다.
DarkDestry

3

몇 년 전, 동적 조명이 저렴 해지기 전에 부가 블렌딩과 함께 2D 빌보드 입자 효과를 사용했습니다. 장면을 흰색으로 밝게합니다. 반딧불의 정확한 깊이로 그림을 그리면 거의 정확한 정렬이 가능합니다. 추가 알파는 알파 블렌딩과 비교하여 자체를 그릴 때 정렬 할 필요가 없습니다. 모든 장면을 밝게 표시하지는 않지만 반딧불 주변 지역을 밝게 표시합니다. 그런 다음 다이내믹 라이트를 촬영하고 필요할 경우 몇 초마다 반딧불 중 하나를 선택하여 실제로 장면을 비출 수 있습니다.

글로우 효과에 대한 질문과 답변이 이미 있습니다. 2D 게임용 Unity에서 이와 같은 조명을 얻는 방법은 무엇입니까?


0

불행히도, 나는 현재 형식으로 Unity에 대해 많은 경험이 없었습니다 (수년 전에 그것을 가지고 놀았습니다). 엔진에서 어떤 기능 세트를 사용 해야하는지 정확히 알지 못합니다.

어쨌든 어떤 엔진을 사용하든 다이나믹 라이트는 가능할 때마다 피해야합니다. 그것들은 계산 비용이 매우 많이 들고, 장면 지수를 매우 지수 적으로 증가시키는 경향이 있습니다. 그러나 대부분의 3D 렌더링의 순서와 마찬가지로 부정 행위를 통해 유사한 효과를 얻을 수있는 여러 가지 방법이 있습니다.

유사한 효과를 얻을 수있는 가능한 방법은 미리 만든 광선 텍스처를 반딧불 아래의 지형에 매핑하는 것입니다 (Y = 위 / 아래 좌표 시스템을 가정). 지형의 광선 위치 및 Y 오프셋을 제어하는 ​​X 및 Z 위치 텍스처의 알파를 제어하는 ​​터 레인에서 (더 밝게 = 터 레인에 더 가깝게)

물론이 방법에는 몇 가지 단점이 있습니다. 빛이 사용되지 않아 그림자를 드리 우지 않으며 세계의 다른 지오메트리 (소품, 단풍 등)에는 영향을 미치지 않습니다.


-2

Light불의 원점에서 사용 하고 스크립트에서 크기를 가지고 놀면 굽기 효과가 있습니다. 그리고 파티클 시스템을 사용하십시오 :)


현장에 불이 없습니다. 희소 입자가있는 임은 존재하거나 존재하지 않는 것으로 나타납니다. 입자에 대한 고정 위치는 전혀 없습니다. 질문을 읽으십시오.
DarkDestry

그래서 거래는 무엇입니까? 미리 정의 된 위치 대신 입자 프리 팹에 빛을 부착 할 수 있습니다
Hamza Hasan

문제는 이것을하는 방법입니다. 유니티의 파티클 시스템을 사용하고 있습니다. 그리고 나는 거기에 조립식을 보지 못한다. 조명이있는 스크립트를 기반으로 스크립트를 생성하는 프리 팹을 만들지 않는 한
DarkDestry

씬에 파티클 게임 오브젝트가 있습니다. 같은 게임 오브젝트에 라이트를 부착하고 해당 게임 오브젝트를 Unity 파일 탐색기로 드래그하여 조립식으로 만듭니다.
Hamza Hasan

장면에 파티클 시스템 게임 오브젝트가 있습니다. 입자가 아닙니다.
DarkDestry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.