Compute Shader samples

 [Unity3D]컴퓨트 셰이더 1/3(개념 및.. : 네이버블로그 (naver.com)

유니티 - 컴퓨트 쉐이더(Compute Shader) | Rito15


compute with VFX graph

Compute Shaders (catlikecoding.com)

Compute shader 연구

// Each #kernel tells which function to compile; you can have many kernels //커널에 함수 선언 부분 #pragma kernel GPU_TestFunctionA // Create a RenderTexture with enableRandomWrite flag and set it // with cs.SetTexture //compute shader 의 결과값을 저장할 buffer선언 RWStructuredBuffer<T>, StructuredBuffer<T>에 매핑된다 RWStructuredBuffer<int> intBuffer; //cpu에서 해당 computeshader에 임의 값을 전달하고 싶은경우. //일반적인 방법으로 변수 선언이 가능하며 CPU스크립트에서는 //해당 변수에 접근하여 값을 전달한다. int intValue; //하나의 그룹에 할당될 스레드의 차원을 의미한다. //아래 선언된 커널함수는 (1024,1,1) 크기의 그룹에서 실행된다. (1024*1*1 총 1024개다) //1024*1*1 로 1차원 설정도 가능하고 32*32*1의 2차원 혹은 4*4*4의 3차원으로도 지정할 수 있다. //이는 계산하고자 하는 차원에 따라 결정된다. //render texture 2D // position 3D // thread group의 limit 은 각 차원별 65525( pow(2,16)-1)이다. // 예를 들어 1024*768의 렌더 텍스쳐를 2차원 병렬 계산을 하고자 할경우. // 8*8*1로 설정한다. 그럼 thread 그룹의 개수는 (1024/8) *(768/8)*1 = 128*98*1 이 된다. // [numthread(8, 8, 1)]로 지정하고 실행시 Dispatch(index, 128, 96, 1) 이런식으로 호출하면 된다. //일반적으로 하나의 thread 그룹 당 할당되는 총 thread 개수는 32의 배수로 최대 256개를 지정하는것이 성능에 좋다고 한다. // 예를 들어 [numthreads(8, 8, 4)], [numthreads(16, 16, 1)], [numthreads(256, 1, 1)] 등등 // 하지만 thread단위의 동작임으로 낭비되지 않게 조절이 필요하다. [numthreads(1024,1,1)] //thread group 지정 void GPU_TestFunctionA (uint3 groupID : SV_GroupID, uint3 groupThreadID : SV_GroupThreadID) { //함수 인자값에 대한 설명 //compute shader에 구현되는 커널함수의 인수에는 제약이 있다. // TODO: insert actual code here! intBuffer[groupThreadID.x] = groupThreadID.x * intValue; } //참고사항 // SystemInfo.supportsComputeShaders를 통해 컴퓨트 쉐이더 지원여부를 확인할 수 있다. // 컴퓨트 쉐이더의 연산 결과를 렌더 텍스쳐에 받아 오려면 렌더 텍스쳐의 랜덤 액세스 기능을 활성화해야 한다. // RenderTexture.enableRandomWrite =true로 설정하면된다. // 또한 렌더 텍스쳐의 생성자에 RenderTextureReadWrite.Linear 옵션을 5번째 매개변수로 전달해야 한다.


Compute shader 연구

// Each #kernel tells which function to compile; you can have many kernels //커널에 함수 선언 부분 #pragma kernel GPU_TestFunctionA // Create a RenderTexture with enableRandomWrite flag and set it // with cs.SetTexture //compute shader 의 결과값을 저장할 buffer선언 RWStructuredBuffer<T>, StructuredBuffer<T>에 매핑된다 RWStructuredBuffer<int> intBuffer; //cpu에서 해당 computeshader에 임의 값을 전달하고 싶은경우. //일반적인 방법으로 변수 선언이 가능하며 CPU스크립트에서는 //해당 변수에 접근하여 값을 전달한다. int intValue; //하나의 그룹에 할당될 스레드의 차원을 의미한다. //아래 선언된 커널함수는 (1024,1,1) 크기의 그룹에서 실행된다. (1024*1*1 총 1024개다) //1024*1*1 로 1차원 설정도 가능하고 32*32*1의 2차원 혹은 4*4*4의 3차원으로도 지정할 수 있다. //이는 계산하고자 하는 차원에 따라 결정된다. //render texture 2D // position 3D // thread group의 limit 은 각 차원별 65525( pow(2,16)-1)이다. // 예를 들어 1024*768의 렌더 텍스쳐를 2차원 병렬 계산을 하고자 할경우. // 8*8*1로 설정한다. 그럼 thread 그룹의 개수는 (1024/8) *(768/8)*1 = 128*98*1 이 된다. // [numthread(8, 8, 1)]로 지정하고 실행시 Dispatch(index, 128, 96, 1) 이런식으로 호출하면 된다. //일반적으로 하나의 thread 그룹 당 할당되는 총 thread 개수는 32의 배수로 최대 256개를 지정하는것이 성능에 좋다고 한다. // 예를 들어 [numthreads(8, 8, 4)], [numthreads(16, 16, 1)], [numthreads(256, 1, 1)] 등등 // 하지만 thread단위의 동작임으로 낭비되지 않게 조절이 필요하다. [numthreads(1024,1,1)] //thread group 지정 void GPU_TestFunctionA (uint3 groupID : SV_GroupID, uint3 groupThreadID : SV_GroupThreadID) { //함수 인자값에 대한 설명 //compute shader에 구현되는 커널함수의 인수에는 제약이 있다. // TODO: insert actual code here! intBuffer[groupThreadID.x] = groupThreadID.x * intValue; } //참고사항 // SystemInfo.supportsComputeShaders를 통해 컴퓨트 쉐이더 지원여부를 확인할 수 있다. // 컴퓨트 쉐이더의 연산 결과를 렌더 텍스쳐에 받아 오려면 렌더 텍스쳐의 랜덤 액세스 기능을 활성화해야 한다. // RenderTexture.enableRandomWrite =true로 설정하면된다. // 또한 렌더 텍스쳐의 생성자에 RenderTextureReadWrite.Linear 옵션을 5번째 매개변수로 전달해야 한다.





댓글

이 블로그의 인기 게시물

About AActor!!! "UObject" has no member "BeginPlay"

UNREAL Android build information

Shader informations nice blog ~ ~