DirectCompute网上各种介绍,特性很简单就是用GPU进行计算,注意资源并不是从管线里面获取的。
1.编译:D3DCompileFromFile
2.创建:ID3D11Device :: CreateComputeShader
资源(dx) :
CSSetConstantBuffers :设置恒定的缓冲区所使用的计算着色器的阶段。
CSSetSamplers :设置一个数组,计算着色器阶段的采样状态。
CSSetShader :设置一个计算着色到该设备。
CSSetShaderResources :数组绑定的着色器资源的计算着色器阶段。
CSSetUnorderedAccessViews :设置一个数组,无序的资源的观点。
除增加一个无序的view其他的跟别的shader一样。
由于之前都是只读的,为CS增加了一组读写的。
执行:
ID3D11DeviceContext::Dispatch :一个三维的阵列,记录着要调度的线程组的次数。
ID3D11DeviceContext::DispatchIndirect
// C++ application code
pImmediateContext->Dispatch(Width / THREADSX, Height / THREADSY, 1 );
// HLSL compute shader code
[numthreads(THREADSX, THREADSY, 1)]
void CS_QJulia4D( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )
的Dispatch的参数与hlsl里面的numthreads是有联系的,表示的是线程组X,Y,Z三个维度的数组,目前shader model5 是x :1024 y:1024 z:64 超出就废了。
系统语义:
SV_GroupID :一个xyz三维向量,描述的是当前线程组在整个调度中的位置[0,n-1]
SV_GroupThreadID :一个xyz的三维向量,记录当前线程在线程组中的三维位置[0,n-1]
SV_DispatchThreadID :一个xyz的三维向量,它记录的是当前线程在整个调度中的位置,如果说groupthreadID是相对当前线程组的,那么dispatchthreadID就是全局的一个位置。
SV_GroupIndex :它是一个索引,记录当前线程在当前线程组中的索引位置,它是一维的。
下图显示了关系之间的参数传递给ID3D11DeviceContext::Dispatch,调度(5,3,2),指定的值在numthreads属性,numthreads(10,8,3),和值将传递到计算着色器线程相关的系统的值(SV_GroupIndex,SV_DispatchThreadID,SV_GroupThreadID,SV_GroupID)。