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 |