프로그래밍 공부
작성일
2023. 12. 14. 16:43
작성자
WDmil
728x90

컴퓨터 쉐이더 라고 하는 방식이다.

 

이름이 조금구리기는 한데, 컴퓨팅 연산을 그래픽카드에서 진행하는 쉐이더를 의미한다.

 

데이터를 전부 Shader에 전달하고, 쉐이더에서 데이터연산을 처리하는 과정을 이야기한다.

 

Buffer형태로 데이터를 전달하고, DeviceContext->Map형태로 데이터가 제공된다.

 

//ComputePicking.hlsl
cbuffer RayBuffer : register(b0)
{
	float3 pos;
	uint triangleSize;
   
	float3 dir;
}

struct InputDesc
{
	float3 v0, v1, v2;
};

StructuredBuffer<InputDesc> input : register(t0);

struct OutputDesc
{
	int picked;
	float distance;
};

RWStructuredBuffer<OutputDesc> output : register(u0);

void Intersection(uint index)
{
	// 평면방정식 전개수식
	float3 A = input[index].v0;
	float3 B = input[index].v1;
	float3 C = input[index].v2;
   
	float3 e0 = B - A;
	float3 e1 = C - A;
   
	float3 P, T, Q;
	P = cross(dir, e1);
   
	float d = 1.0f / dot(e0, P);

	float u, v;
   
	T = pos - A;
	u = dot(T, P) * d;
   
	Q = cross(T, e0);
	v = dot(dir, Q) * d;
	output[index].distance = dot(e1, Q) * d;

	bool b = (u >= 0.0f) && (v >= 0.0f) &&
            (u + v <= 1.0f) && (output[index].distance >= 0.0f);
	// 디스턴스가 -가 될 수 있다.
	output[index].picked = b ? 1 : 0;
}

[numthreads(64, 1, 1)]
void CS(uint3 DTid : SV_DispatchThreadID)
{
	uint index = DTid.x;
   
	if (triangleSize > index)
		Intersection(index);
}

 

대략 위와같은 CS로 DirectX에서 지원하는 프로그래밍 방식을 사용한다.

 


[numthreads(64, 1, 1)]

은 할당된 스레드를 의미한다.

 

64개의 x축행, 1개의 y축행, 1개의 z축행으로,

 

대부분의 DeviceContext의 z축은 3개 y축은 8개, x축은 스레드개수 * 가상스레드개수 로 이루어진다.

 

여기서 할당스레드를 정의해주는 DTid는 데이터의 주소값 위치를 정의하는 것으로.

 

DispatchThreadID를 통해 index는 DTid.x의 값과 같은 번호 주소값을 의미하고,

 

index범위가 triangleSIze보다 클경우, 할당된 스레드의 범위가 더 크다는 의미임으로, 데이터 처리를 하지않고 넘긴다는 말이다.

 

만약 할당된 데이터범위가 traiangleSize보다 작을경우, 각 스레드는 Intersection(index)를 수행한다.

 

CS는 모든 스레드에 데이터를 할당하고, 각 스레드는 함수동작을 수행하는 형식이다.

728x90

'컴퓨터 용어 정리' 카테고리의 다른 글

A* Algorithm  (0) 2023.12.20
휴리스틱(Heuristic)  (0) 2023.12.20
DirectX::DeviceContext->Map, Unmap  (0) 2023.12.14
DirectX::DeviceContext->UpdateSubresource  (0) 2023.12.14
멀티 프로세스  (0) 2023.12.14