[VFXGraph] 속도도 위치가 0.5에서 벗어난 문제의 응급 처리

입문


Houdini를 사용하여 다음 VectorField를 만들었습니다.
0-0.5이외에 속도(0,0,0)

위의 VectorField를 참조하십시오.fga 파일로 Unity 가져오기
VisualEffectGraph에서 속도도로 사용됩니다.


발생한 문제


결과적으로 3D 텍스쳐(속도 맵) 위치가 0.5에서 벗어납니다.

입자는 좌표(0,0,0)를 중심으로 입방체이지만 속도 맵은 좌표(0.5,0.5,0.5)를 중심으로 분포됩니다.
이번에는 원본 코드를 개조해서 이 문제를 해결했기 때문에 나는 그것을 필기하고 싶다.

환경


Unity2019.1.1f1
Visual Effect Graph - Version 5.13.0 (Preview)

대책1: 입자의 생성 위치를 0.5로 엇갈리게 한다(오류된 대책)


(스토리지 패키지 폴더)\편집기\Blocks\Implementations\위치 폴더
PositionAABox.cs에서 다음 코드를 볼 수 있습니다.
PositionAABox.cs
...
        public override string source
        {
            get
            {
                if (positionMode == PositionMode.Volume)
                {
                    return @"position = Box_size * (RAND3 - 0.5f) + Box_center;";
                }
...
참고로 source 는 VisualEffectGraph 내부 관리의 계산 착색기의 일부입니다.

코드 다시 쓰기


상술한 코드를 다음과 같이 개작하다.
PositionAABox.cs
...
        public override string source
        {
            get
            {
                if (positionMode == PositionMode.Volume)
                {
                    // return @"position = Box_size * (RAND3 - 0.5f) + Box_center;";
                    return @"position = Box_size * (RAND3) + Box_center;";
                }
...
참조:
[Unity] PackageManager가 제공하는 패키지의 다운로드 목적지와 패키지 개조 방법
http://tsubakit1.hateblo.jp/entry/2018/08/16/221016

결과


Unity를 개조한 상태에서 다시 시작할 때는 다음과 같습니다.

위치 중심 오프셋 (0.5,0.5,0.5)
언뜻 보기에는 옳은 것 같지만 (0,0,0) 중심의 속도 분포를 원했던 것은 잘못된 대책이었다.
PositionAABox.cs 수정 전 상태로 복원

대책 2: 3D 텍스쳐의 샘플링 위치를 0.5(올바른 대책일 수 있음)


(스토리지 패키지 폴더)\편집기\Blocks\Implementations\속성 폴더
정탐AttributeFromMap.cs하면 다음과 같은 코드가 있습니다.
다음 코드SamplePosition는 3차원 무늬의 샘플링 위치입니다.
AttributeFromMap.cs
...
if (SampleMode == AttributeMapSampleMode.Sample2DLOD || SampleMode == AttributeMapSampleMode.Sample3DLOD)
{
    output += string.Format(@"
{0} value = ({0})attributeMap.t.SampleLevel(attributeMap.s, SamplePosition, LOD);
{1}
", GetCompatTypeString(valueType), biasScale);
}
...
다음으로 변경합니다.
AttributeFromMap.cs
...
if (SampleMode == AttributeMapSampleMode.Sample2DLOD || SampleMode == AttributeMapSampleMode.Sample3DLOD)
{
    output += string.Format(@"
{0} value = ({0})attributeMap.t.SampleLevel(attributeMap.s, SamplePosition + 0.5f, LOD);
{1}
", GetCompatTypeString(valueType), biasScale);
}
...

결과


Unity를 개조한 상태에서 다시 시작할 때는 다음과 같습니다.

(0,0,0) 중심의 속도 분포.

추가:attributeMap의 정의 위치

attributeMap는 VFXCommon입니다.cginc에서 정의한 구조체인 것 같습니다.Set Velocity from Map의 샘플 모드를 샘플 3D LOD로 설정하면 다음 구조는attributeMap 형식으로 사용됩니다.
(패키지의 스토리지 폴더)\Shaders\VFXCommon.cginc
...
struct VFXSampler3D
{`
    Texture3D t;
    SamplerState s;
};
...

참조 링크


Houdini에서 VectorField(.fga)를 만드는 방법(예제 항목 포함)
https://forty.hatenadiary.jp/entry/2018/11/07/000250
[Unity] FGA를 Unity로 가져와 Visual Effect Graph의 VectorField로 사용하는 방법
https://forty.hatenadiary.jp/entry/2018/11/07/043600
[Unity] PackageManager가 제공하는 패키지의 다운로드 목적지와 패키지 개조 방법
http://tsubakit1.hateblo.jp/entry/2018/08/16/221016

좋은 웹페이지 즐겨찾기