일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- render target2d
- kanban
- IntersectionObserver
- HTML
- League of Legend
- Fluid simulation
- HLSL
- Unreal
- CSS
- unreal c++ #unreal #unreal build #unreal
- Compute Shader
- page dot
- visual studio integration tool 상태
- Niagara
- Riot Games
- scroll-snap
- niagara.pdb 로드되지 않음
- unreal niagara with compute shader
- unreal niagara
- texture render target
- JavaScript
- unreal compute shader #unreal niagara #unreal #compute shader #unreal niagara with compute shader
- unreal visual studio
- unreal compute shader
- Game Developement
- jquery
- carousel indicator
- hlsl with unreal
- render target
- Agile 게임 개발
- Today
- Total
Nephrite21
언리얼 유체 시뮬레이션 과정 2 - 컴퓨트 셰이더 세팅 본문
위 글 참조 후 작성
기존 프로젝트에서는 제대로 된 계산을 진행하지 못하고 있음.
왜? Niagara 내에서는 직접적인 버퍼 접근과 연산이 불가능하기 때문에.
따라서 컴퓨트 셰이더를 이용해서 Render Target을 생성후, 해당 값을 읽어와서 파티클의 위치만을 조정하는 시스템 구성할 계획
따라서
1. 나이아가라 시스템 상에서 파티클을 생성 및 해당 파티클의 위치정보를 저장.
2. 저장된 위치 정보를 Compute Shader를 이용하여 연산.
3. Compute Shader에서 Render Target으로 정보 저장.
4. 저장된 정보를 Niagara System에서 읽어와서 해당 값을 기반으로 파티클을 렌더링
따라서 직접적인 연산은 Compute Shader가 진행하고, 렌더링과 같은 부분만 Niagara 에서 담당하는 것이다.
이를 위해 Compute Shader를 셋업해야한다.
여기서는 Shadeup 이라는 플러그인 생성 도구? 를 이용해서 하기로 하였다.
https://www.youtube.com/watch?v=19q6eXw2pI0
위 영상을 통해서 셋업 진행하기로 하였다.
1. Node.js 다운로드
2. 윈도우 커맨드창에
npm i @shadeup/unreal -g
를 입력해서 shadeup을 설치한다.
3.
$ cd my-unreal-engine-project
$ shadeup-unreal
내 프로젝트 디렉토리로 이동해서 진행한다.
이전에 먼저 프로젝트에서 Edit -> Plugins -> add 에서 Blank로 설정해서 새로 플러그인을 만들고, 이 플러그인을 활용할 에정이다.
우리는 Compute Shader에서 Render Target으로 데이터를 옮기고, 이 데이터를 Niagara에서 읽을 예정이므로, 선택지가 나오면 Compute Shader 와 Render Target을 선택해주면 된다.
진행이 끝나면 1에서 했던 CPP로 빌드 과정 거치고 나면
이렇게 프로젝트가 설정된다.
이제 TestShader.usf에 수정된 내용이 언리얼 상에서 제대로 작동한다.
#include "/Engine/Public/Platform.ush"
RWTexture2D<float3> RenderTarget;
[numthreads(THREADS_X, THREADS_Y, THREADS_Z)]
void TestShader(
uint3 DispatchThreadId : SV_DispatchThreadID,
uint3 groupThread : SV_GroupThreadID )
{
float groupU = ((float) groupThread.x) / ((float) THREADS_X);
float groupV = ((float) groupThread.y) / ((float) THREADS_Y);
RenderTarget[DispatchThreadId.xy] = float3(groupU, groupV, 0.0);
}
이렇게 설정하고 비어있는 RenderTarget을 만들어서
레벨 블루프린트에 이렇게 연결해주면
레벨이 시작하자마자 Render Target의 값이
이렇게 바뀐다.
다음 포스트에서 각각의 코드를 자세하게 분석해보도록 하겠다.