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번째 매개변수로 전달해야 한다.
댓글
댓글 쓰기