#define VC_EXTRALEAN #define WIN32_LEAN_AND_MEAN #include #include #define D3D11_NO_HELPERS #include #include #include #define ATOM_EDIT 0xC018 #define ATOM_STATIC 0xC019 #define WIDTH 1280 #define HEIGHT 720 #define _FULLSCREEN HWND hWnd; typedef struct { // DXGI_MODE_DESC BufferDesc; UINT Width; UINT Height; //DXGI_RATIONAL RefreshRate; UINT Numerator; UINT Denominator; DXGI_FORMAT Format; DXGI_MODE_SCANLINE_ORDER ScanlineOrdering; DXGI_MODE_SCALING Scaling; // DXGI_SAMPLE_DESC SampleDesc; UINT Count; UINT Quality; DXGI_USAGE BufferUsage; UINT BufferCount; HWND OutputWindow; BOOL Windowed; DXGI_SWAP_EFFECT SwapEffect; UINT Flags; } HG_DXGI_SWAP_CHAIN_DESC; #ifdef FULLSCREEN HG_DXGI_SWAP_CHAIN_DESC swapChainDesc = { WIDTH, HEIGHT, 0, 1, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, DXGI_MODE_SCALING_UNSPECIFIED, 1, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT, 1, 0, 0, DXGI_SWAP_EFFECT_DISCARD, 0 }; #else HG_DXGI_SWAP_CHAIN_DESC swapChainDesc = { WIDTH, HEIGHT, 0, 1, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, DXGI_MODE_SCALING_UNSPECIFIED, 1, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT, 1, 0, -1, DXGI_SWAP_EFFECT_DISCARD, 0 }; #endif ID3D11Device* device; ID3D11DeviceContext* context; IDXGISwapChain* swapChain; ID3D11Texture2D* backBufferTexture; //ID3D11RenderTargetView* renderTargetView; ID3D11UnorderedAccessView* backBufferUAV; struct TEXTURE_2D_SRV_UAV_RTV { ID3D11Texture2D* TEX; ID3D11ShaderResourceView* SRV; ID3D11UnorderedAccessView* UAV; ID3D11RenderTargetView* RTV; }; void createSRVUAVRTV(TEXTURE_2D_SRV_UAV_RTV* tex, int width, int height) { static D3D11_TEXTURE2D_DESC texDesc = { width, height, 0, 1, DXGI_FORMAT_R16G16B16A16_FLOAT, {1, 0}, D3D11_USAGE_DEFAULT, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS, 0, D3D11_RESOURCE_MISC_GENERATE_MIPS }; device->CreateTexture2D(&texDesc, NULL, &tex->TEX); device->CreateShaderResourceView(tex->TEX, NULL, &tex->SRV); device->CreateUnorderedAccessView(tex->TEX, NULL, &tex->UAV); device->CreateRenderTargetView(tex->TEX, NULL, &tex->RTV); } int main(int argc, char** argv) { #ifdef FULLSCREEN ShowCursor(0); HWND hWnd = CreateWindowExA(0, (LPCSTR)ATOM_STATIC, 0, WS_POPUP | WS_VISIBLE | WS_MAXIMIZE, 0, 0, WIDTH, HEIGHT, 0, 0, 0, 0); //ShowWindow(hWnd, SW_SHOW); #else HWND hWnd = CreateWindowExA(WS_EX_TOPMOST, (LPCSTR)ATOM_STATIC, 0, WS_POPUP | WS_VISIBLE, 0, 0, WIDTH, HEIGHT, 0, 0, 0, 0); #endif //ShowWindow(hWnd, SW_SHOW); swapChainDesc.OutputWindow = hWnd; D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, NULL, 0, D3D11_SDK_VERSION, (DXGI_SWAP_CHAIN_DESC*)&swapChainDesc, &swapChain, &device, NULL, &context); swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferTexture); device->CreateUnorderedAccessView(backBufferTexture, NULL, &backBufferUAV); const char src[] = "RWTexture2D o0:register(u0);\n" "[numthreads(16,16,1)]\n" "void cs(uint3 id:SV_DispatchThreadID) {\n" "o0[id.xy]=float4(1,id.xy/float2(1280,720),1);\n" "}" ; ID3DBlob* blob; ID3DBlob* errorBlob; //if (D3DCompile(src, sizeof(src), NULL, NULL, NULL, "cs", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { // MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); // return EXIT_FAILURE; //} if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csRaytrace", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csRaytrace; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csRaytrace); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csLensDirt", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csLensDirt; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csLensDirt); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csStreaks", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csStreaks; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csStreaks); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBlurH", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csBlurH; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBlurH); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBlurV", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csBlurV; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBlurV); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBokehPreprocess", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csBokehPreprocess; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBokehPreprocess); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBokehFirst", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csBokehFirst; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBokehFirst); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBokehSecond", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csBokehSecond; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBokehSecond); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csTestScene", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL0, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csTestScene; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csTestScene); if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csRadialCircumferentialBlur", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL0, 0, &blob, &errorBlob)) { MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR); return EXIT_FAILURE; } ID3D11ComputeShader* csRadialCircumferentialBlur; device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csRadialCircumferentialBlur); TEXTURE_2D_SRV_UAV_RTV tex0, tex1, tex2, tex3, tex4; createSRVUAVRTV(&tex0, 1280, 720); createSRVUAVRTV(&tex1, 1280, 720); createSRVUAVRTV(&tex2, 1280, 720); createSRVUAVRTV(&tex3, 1280, 720); D3D11_SAMPLER_DESC samplerDesc = { D3D11_FILTER_MIN_MAG_MIP_LINEAR, //D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_FILTER_ANISOTROPIC D3D11_TEXTURE_ADDRESS_CLAMP, D3D11_TEXTURE_ADDRESS_CLAMP, D3D11_TEXTURE_ADDRESS_CLAMP, 0.0f, 1, D3D11_COMPARISON_ALWAYS, {0,0,0,0}, 0, D3D11_FLOAT32_MAX }; ID3D11SamplerState* sampler; device->CreateSamplerState(&samplerDesc, &sampler); context->CSSetSamplers(0, 1, &sampler); do { //context->CSSetUnorderedAccessViews(0, 1, &backBufferUAV, NULL); context->CSSetUnorderedAccessViews(0, 1, &tex3.UAV, NULL); context->CSSetShader(csLensDirt, NULL, 0); context->Dispatch(80, 45, 1); if (0) { context->CSSetUnorderedAccessViews(0, 1, &tex0.UAV, NULL); context->CSSetShaderResources(0, 1, &tex3.SRV); context->CSSetShader(csBokehPreprocess, NULL, 0); context->Dispatch(80, 45, 1); ID3D11UnorderedAccessView* bokehFirstUAV[] = {tex1.UAV, tex2.UAV}; ID3D11ShaderResourceView* bokehFirstSRV[] = {tex0.SRV}; context->CSSetUnorderedAccessViews(0, 2, bokehFirstUAV, NULL); context->CSSetShaderResources(0, 1, bokehFirstSRV); context->CSSetShader(csBokehFirst, NULL, 0); context->Dispatch(80, 45, 1); //context->GenerateMips(tex1.SRV); //context->GenerateMips(tex2.SRV); ID3D11UnorderedAccessView* bokehSecondUAV[] = {tex3.UAV, NULL}; ID3D11ShaderResourceView* bokehSecondSRV[] = {tex1.SRV, tex2.SRV }; context->CSSetUnorderedAccessViews(0, 2, bokehSecondUAV, NULL); context->CSSetShaderResources(0, 2, bokehSecondSRV); context->CSSetShader(csBokehSecond, NULL, 0); context->Dispatch(80, 45, 1); } context->GenerateMips(tex3.SRV); context->CSSetUnorderedAccessViews(0, 1, &backBufferUAV, NULL); context->CSSetShaderResources(0, 1, &tex3.SRV); context->CSSetShader(csRadialCircumferentialBlur, NULL, 0); context->Dispatch(80, 45, 1); ID3D11UnorderedAccessView* nullUAV[] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; ID3D11ShaderResourceView* nullSRV[] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; context->CSSetUnorderedAccessViews(0, 8, nullUAV, NULL); context->CSSetShaderResources(0, 8, nullSRV); #ifndef FULLSCREEN PeekMessageA(0, 0, 0, 0, PM_NOREMOVE); #endif swapChain->Present(1, 0); } while (!GetAsyncKeyState(VK_ESCAPE)); ExitProcess(0); return EXIT_SUCCESS; }