2012-09-12 21 views
7

Tôi thực sự mới đối với công nghệ DirectCompute và đã cố gắng tìm hiểu từ tài liệu trên trang web msdn, dày đặc, để nói ít nhất.HLSL đệm sải chân và luồng - những gì đang xảy ra ở đây?

Tôi muốn tạo một tệp hlsl cơ bản có trong ma trận 4x4 và ma trận 4xN và trả về kết quả nhân. Nhưng sau khi dành thời gian chơi với mã, tôi đã tìm thấy một số thứ kỳ lạ mà tôi không hiểu - chủ yếu là với cách mà các luồng mà tôi truyền vào trong bộ đệm và dữ liệu đầu ra.

Với tất cả các ví dụ này, tôi chuyển qua hai bộ đệm nổi 16 và lấy ra 16 bộ đệm nổi và sau đó Gửi với nhóm 4x1x1 - Tôi có thể hiển thị mã cho bạn, nhưng tôi thực sự chưa biết điều gì sẽ giúp bạn giúp tôi . Hãy cho tôi biết nếu có một phần của mã C++ của tôi bạn muốn xem.

với đoạn mã sau:

StructuredBuffer<float4x4> base_matrix  : register(t0); // byteWidth = 64 
StructuredBuffer<float4> extended_matrix : register(t1); // byteWidth = 64 
RWStructuredBuffer<float4> BufferOut  : register(u0); // byteWidth = 64, zeroed out before reading from the GPU 

[numthreads(1, 1, 1)] 
void CSMain(uint3 DTid : SV_DispatchThreadID) 
{ 
    BufferOut[DTid.x].x = 1; 
} 

tôi nhận được các giá trị sau ra:

1.000 0.000 0.000 0.000 
1.000 0.000 0.000 0.000 
1.000 0.000 0.000 0.000 
1.000 0.000 0.000 0.000 

Điều này làm cho ý nghĩa với tôi - bộ đệm được phân tách như 4 chủ đề, từng thực hiện 1 float4 nhóm.

với đoạn mã sau:

StructuredBuffer<float4x4> base_matrix  : register(t0); // byteWidth = 64 
StructuredBuffer<float4> extended_matrix : register(t1); // byteWidth = 64 
RWStructuredBuffer<float4> BufferOut  : register(u0); // byteWidth = 64, zeroed out before reading from the GPU 

[numthreads(1, 1, 1)] 
void CSMain(uint3 DTid : SV_DispatchThreadID) 
{ 
    BufferOut[DTid.x].x = 1; 
    BufferOut[DTid.x].y = 2; 
    BufferOut[DTid.x].z = 3; 
    BufferOut[DTid.x].w = 4; 
} 

tôi nhận được các giá trị sau ra:

1.000 1.000 1.000 1.000 
1.000 1.000 1.000 1.000 
1.000 1.000 1.000 1.000 
1.000 1.000 1.000 1.000 

và với mã thực tế tôi muốn chạy:

StructuredBuffer<float4x4> base_matrix  : register(t0); 
StructuredBuffer<float4> extended_matrix : register(t1); 
RWStructuredBuffer<float4> BufferOut  : register(u0); 

[numthreads(1, 1, 1)] 
void CSMain(uint3 DTid : SV_DispatchThreadID) 
{ 
    BufferOut[DTid.x] = mul(base_matrix[0],extended_matrix[DTid.x]) 
} 

tôi nhận được các giá trị sau:

0.000 0.000 0.000 0.000 
0.000 0.000 0.000 0.000 
0.000 0.000 0.000 0.000 
0.000 0.000 0.000 0.000 

Tôi có thể nói tôi đang thiếu một điều quan trọng ở đây, nhưng đối với cuộc sống của tôi, tôi không thể tìm thấy tài liệu thích hợp cho tôi biết cách thức hoạt động của chúng. Ai đó có thể giúp tôi hiểu những gì đang xảy ra trong mã này?

Cảm ơn thời gian của bạn,

Zach

Như lưu ý khác, mã này được cribbed nhau bằng cách sử dụng Microsoft DirectX SDK (tháng 6 năm 2010) \ Samples \ C++ \ Direct3D11 \ BasicCompute11 mẫu có sẵn. Nếu tôi làm điều gì đó khủng khiếp sai, hãy cho tôi biết. Tôi thực sự mới ở HLSL.

Chỉnh sửa: Mã tạo bộ đệm của tôi.

CreateStructuredBuffer(g_pDevice, sizeof(float)*16,  1,   g_matrix,   &g_pBuf0); 
CreateStructuredBuffer(g_pDevice, sizeof(float)*4,  NUM_ELEMENTS, g_extended_matrix, &g_pBuf1); 
CreateStructuredBuffer(g_pDevice, sizeof(float)*4,  NUM_ELEMENTS, NULL,    &g_pBufResult); 

//-------------------------------------------------------------------------------------- 
// Create Structured Buffer 
//-------------------------------------------------------------------------------------- 
HRESULT CreateStructuredBuffer(ID3D11Device* pDevice, UINT uElementSize, UINT uCount, VOID* pInitData, ID3D11Buffer** ppBufOut) 
{ 
    *ppBufOut = NULL; 

    D3D11_BUFFER_DESC desc; 
    ZeroMemory(&desc, sizeof(desc)); 
    desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE; 
    desc.ByteWidth = uElementSize * uCount; 
    desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; 
    desc.StructureByteStride = uElementSize; 

    if (pInitData) 
    { 
     D3D11_SUBRESOURCE_DATA InitData; 
     InitData.pSysMem = pInitData; 
     return pDevice->CreateBuffer(&desc, &InitData, ppBufOut); 
    } else 
     return pDevice->CreateBuffer(&desc, NULL, ppBufOut); 
} 

cố gắng .1, .2, .3, .4 ...

StructuredBuffer<float4x4> base_matrix  : register(t0); 
StructuredBuffer<float4> extended_matrix : register(t1); 
StructuredBuffer<uint>  loop_multiplier : register(t2); 
RWStructuredBuffer<float4> BufferOut  : register(u0); 

[numthreads(1, 1, 1)] 
void CSMain(uint3 DTid : SV_DispatchThreadID) 
{ 
    BufferOut[DTid.x].x = .1; 
    BufferOut[DTid.x].y = .2; 
BufferOut[DTid.x].z = .3; 
BufferOut[DTid.x].w = .4; 
} 

đã này ra:

0.100 0.100 0.100 0.100 
0.100 0.100 0.100 0.100 
0.100 0.100 0.100 0.100 
0.100 0.100 0.100 0.100 
+1

bạn có thể đăng các mã nơi bạn tạo ID3D11Buffers của bạn và ID3D11ShaderResourceView và ID3D11UnorderedAccessView tương ứng đối tượng, bao gồm các nội dung của * khác nhau đối tượng _DESC sử dụng để tạo ra chúng? Ngoài ra, linh cảm ngẫu nhiên: bạn có thể thử viết ra 0,1, 0,2, 0,3, 0,4 thay vì 1,2,3,4 trong ví dụ thứ hai không? – postgoodism

+0

Tôi sẽ đăng bài này vào buổi sáng (eta 8 giờ). Didnt bắt này cho đến sau này. Nhưng cảm ơn trước! –

+0

@postgoodism: Đã thêm mã tạo bộ đệm của tôi. Cho tôi biết nếu bạn cần thứ gì khác. –

Trả lời

0

Tôi đã thử theo cách của bạn, nhưng tôi có một kết quả chính xác. Tôi không thể thêm nhận xét vì danh tiếng nhỏ của tôi. Đây là mã của tôi.

HLSL:

RWStructuredBuffer Output: register (u0);

[numthreads (1, 1, 1)]

void main (uint3 DTid: SV_DispatchThreadID)

{ if (DTid.x> 4)

return; 

Output[DTid.x].x= 1.f; 

Output[DTid.x].y = 2.f; 

Output[DTid.x].z = 3.f; 

Output[DTid.x].w = 4.f; 

}

C++:

xác định PathName

L "C: \ Users \ e \ Desktop \ D3D_Reseach \ RenderPro \ x64 \ Debug \ ComputeShader.cso"

struct Buffer

{

XMFLOAT4 Test; 

};

int APIENTRY wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR

lpCmdLine, int nCmdShow)

{

Hardware HardWare; 

WinSystem Win; 

Win.CreateWindows(HardWare, 400, 300); 

ShowWindow(Win.hwnd, SW_HIDE); 

//UAV 

SharedComPtr<ID3D11UnorderedAccessView> Resource; 

SharedComPtr<ID3D11Buffer>       _Buffer; 

ShaderResourceView::STRUCT_BUUFER_DESC Desc; 

Desc.ACCESS = 0; 

Desc.BIND = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS; 

Desc.FORMAT = DXGI_FORMAT_UNKNOWN; 

Desc.HasScr = false; 

Desc.MISC = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; 

Desc.USAGE = D3D11_USAGE_DEFAULT; 

Desc.ByteWidth= 4 * sizeof(Buffer); 

Desc.StructureByteStride= sizeof(Buffer); 

Desc.UAV_OR_SRV = ShaderResourceView::UAV; 

ShaderResourceView :: CreateStructBuffer (HardWare.GetD3DDevice(), quyết định, nullptr, Resource.GetTwoLevel(), _Buffer.GetTwoLevel(), true);

//CompilerShader 

SharedComPtr<ID3D11ComputeShader>  ComputerSahder; 

SharedComPtr<ID3DBlob>        Blob; 

WCHAR *Name = PathName; 

CompilerShader::CompileShaderFromBinary(ComputerSahder.GetTwoLevel(), Name, HardWare.GetD3DDevice(), 
                   Blob.GetTwoLevel(), CompilerShader::ShaderFlag::ComputeShader); 

//Set ComputerHlsl 

HardWare.GetDeviceContext()->CSSetUnorderedAccessViews(0, 1, 

Resource.GetTwoLevel(), 0);

HardWare.GetDeviceContext()->CSSetShader(ComputerSahder.Get(), 0, 0); 

HardWare.GetDeviceContext()->Dispatch(4, 1, 1); 

//SRV 

Buffer Hy[4]; 

VOID *P = Hy; 

ID3D11Buffer* pBuffer; 

BufferSystem::CreateConstanceBuffer(HardWare.GetD3DDevice(), P, pBuffer, 

Desc.ByteWidth, D3D11_USAGE_STAGING);

HardWare.GetDeviceContext()->CopyResource(pBuffer, _Buffer.Get()); 

D3D11_MAPPED_SUBRESOURCE Data; 

HardWare.GetDeviceContext()->Map(pBuffer, 0, D3D11_MAP_READ, 0, &Data); 

Buffer *PP = reinterpret_cast<Buffer*>(Data.pData); 

for (UINT i = 0; i < 4; ++i) { 

    float a = PP[i].Test.x; 

    a = PP[i].Test.y; 

    a = PP[i].Test.z; 

    a = PP[i].Test.w; 

    a = PP[i].Test.w; 

} 

}

+0

Tôi xin lỗi vì sự lộn xộn của mã. –

Các vấn đề liên quan