Unity 4에서 사용할 Compute Shader 작성하기 3d 노이즈를 얻으려고합니다.쉐이더 계산 3d float 배열
목표는 C# 코드에서 내 계산 쉐이더에 multidiminsional float3 배열을 가져 오는 것입니다. 이것은 가능한 일종의 선언을 사용하여 간단하게 가능합니까 아니면 Texture3D 객체를 사용해서 만 구현할 수 있습니까?
저는 현재 개별 float3 포인트에서 작동하는 단일 노이즈의 구현을 가지고 있습니다. 단일 부동 -1을 1로 출력합니다. 코드 here을 컴퓨팅 쉐이더로 이식했습니다.
배열의 각 float3 지점에 노이즈 연산을 적용하여 float3의 3D 배열 (C#에서 가장 가까운 비교는 Vector3[,,]
)로 작업을 확장하고 싶습니다.
나는 다른 몇 가지 시도를 해봤지만 기분이 좋지 않고 병렬 접근 방식을 사용하는 데 완전히 빠져 있습니다. 위는 내가 상상해야 할 모습입니다.
나는 또한 Scrawk's Implemenation을 버텍스 쉐이더로 작업 할 수있었습니다. Scrawk는 Texture3D을 사용하여 3D float4 배열을 쉐이더에 넣습니다. 그러나 저는 텍스처에서 수레를 추출 할 수 없었습니다. Compute Shaders가 어떻게 작동합니까? 텍스처에 의지? 아마도 텍스처에서 값을 가져 오는 것에 관한 것을 간과 한 것 같습니다. 이 사용자가 데이터를 가져 오는 방법이 this post 인 것으로 보입니다. 내 질문과 비슷한 질문이지만, 내가 찾던 답변이 아닙니다.
쉐이더에 익숙하지 않은 나는 Compute Shaders와 그 작동 원리에 대해 근본적으로 뭔가 빠져있는 것처럼 느껴집니다. 목표는 Compute Shaders (또는 이런 종류의 작업에 가장 적합한 쉐이더)를 사용하여 GPU에 행진 큐브를 사용하여 노이즈 생성 및 메쉬 계산을 얻는 것입니다 (짐작 했겠지만).
int volumeSize = 16;
compute.SetInt ("simplexSeed", 10);
// This will be a float[,,] array with our density values.
ComputeBuffer output = new ComputeBuffer (/*s ize goes here, no idea */, 16);
compute.SetBuffer (compute.FindKernel ("CSMain"), "Output", output);
// Buffer filled with float3[,,] equivalent, what ever that is in C#. Also what is 'Stride'?
// Haven't found anything exactly clear. I think it's the size of basic datatype we're using in the buffer?
ComputeBuffer voxelPositions = new ComputeBuffer (/* size goes here, no idea */, 16);
compute.SetBuffer (compute.FindKernel ("CSMain"), "VoxelPos", voxelPositions);
compute.Dispatch(0,16,16,16);
float[,,] res = new float[volumeSize, volumeSize, volumeSize];
output.GetData(res); // <=== populated with float density values
MarchingCubes.DoStuff(res); // <=== The goal (Obviously not implemented yet)
을 그리고 여기에 일반적으로 계산 쉐이더
#pragma kernel CSMain
uniform int simplexSeed;
RWStructuredBuffer<float3[,,]> VoxelPos; // I know these won't work, but it's what I'm trying
RWStructuredBuffer<float[,,]> Output; // to get in there.
float simplexNoise(float3 input)
{
/* ... A bunch of awesome stuff the pastebin guy did ...*/
return noise;
}
/** A bunch of other awesome stuff to support the simplexNoise function **/
/* .... */
/* Here's the entry point, with my (supposedly) supplied input kicking things off */
[numthreads(16,16,16)] // <== Not sure if this thread count is correct?
void CSMain (uint3 id : SV_DispatchThreadID)
{
Output[id.xyz] = simplexNoise(VoxelPos.xyz); // Where the action starts.
}
그래, 확실히 num 스레드 물건을 grock하려고합니다. 그래, 목표는 voxel 지형입니다 :) 이것은 재판에 의한 것 같습니다 대부분 proc 지형 devs 얼굴. 높이 맵이 아닌 점군을 원하기 때문에 3D 배열을 사용할 것입니다. 이로 인해 오버행과 동굴 등이 생성됩니다. CPU에서 실행되는 구현이 있지만 청크를 생성하는 동안 약 20fps입니다. 다차원 플로트 데이터를 계산 쉐이더로 가져 오는 유일한 방법은 Texture2D 또는 Texture3D를 사용하는 것입니다. 또는 REStructuredBuffer에 사용할 수있는 다른 형식 구문이 있습니까? –
PandemoniumSyndicate
이것은 아마도 나에게 약간의 presumptuos지만, 나는 당신이 그것에 대해 잘못된 길을 가고 있다고 생각한다. 그와 같은 배열을 생성하는 것은 실현 가능하지 않다. 그것은 2 패스 프로세스이고, 먼저 "스택 높이"를 생성한다. 레벨 "로 채우고"먼지 "로 채운 다음 동일한 배열에서"터널을 파다 "라는 절차 (커널 계산)를 실행하십시오. – War
당연히 GPU 보석에 접근하는 것은 물론 ... http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html ... 만약 당신이 잡음 기능을 가진 밀도 함수를 혼란스럽게 할 수도 있습니다. , 그들은 비슷하지만 여전히 다른 기능입니다. – War