#define VC_EXTRALEAN #define WIN32_LEAN_AND_MEAN #include #include #define D3D11_NO_HELPERS #include #include #include #define PARTICLE_COUNT 512 #define PARTICLE_STRIDE 56 #define ATOM_EDIT 0xC018 #define ATOM_STATIC 0xC019 #define WIDTH 1280 #define HEIGHT 720 #define _FULLSCREEN 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; struct ConstantBufferType { float demoTime; float deltaTime; float dummy1; float dummy2; }; #pragma bss_seg(".bss") static HWND hWnd; static ID3D11Device* device; static ID3D11DeviceContext* context; static IDXGISwapChain* swapChain; static ID3D11Texture2D* backBufferTexture; static ID3D11RenderTargetView* renderTargetView; static ID3D11UnorderedAccessView* particleBufferUAV; static ID3D11ShaderResourceView* particleBufferSRV; static ID3D11Buffer* particleBuffer; static ID3D11Buffer* constantBuffer; static ID3D11ComputeShader* initShader; static ID3D11ComputeShader* updateShader; static ID3D11ComputeShader* drawShader; static ID3D11VertexShader* particleVertexShader; static ID3D11GeometryShader* particleGeometryShader; static ID3D11PixelShader* particlePixelShader; static ID3D11InputLayout* particleInputLayout; static ID3D11RenderTargetView* backBufferRtv; static ID3D11BlendState* alphaBlendState; static ID3D11RasterizerState* rasterizerState; static ID3D11VertexShader* raymarchingVertexShader; static ID3D11PixelShader* raymarchingPixelShader; //--- // Postprocessing shaders //--- static ID3D11UnorderedAccessView* backBufferUAV; static ID3D11ComputeShader* csDistortChroma; static ID3D11ComputeShader* csRadialBlur; static ID3D11ComputeShader* csCircumferentialBlur; static ID3D11ComputeShader* csStreaks; static ID3D11ComputeShader* csLensDirt; static ID3D11ComputeShader* csBlurH; static ID3D11ComputeShader* csBlurV; static ID3D11ComputeShader* csGhosts; static ID3D11ComputeShader* csMerge; static pD3DCompile d3dCompile; static ID3DBlob* shaderBlob; static void* shaderCode; static SIZE_T shaderSize; static D3D11_MAPPED_SUBRESOURCE mappedResource; static float zero[4]; #pragma data_seg(".d3dcompiler") static char* d3dcompiler = "d3dcompiler_47.dll"; #pragma data_seg(".swapChainDesc") #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 #pragma data_seg(".depthBufferDesc") static D3D11_TEXTURE2D_DESC depthBufferDesc = { WIDTH, HEIGHT, 1, 1, DXGI_FORMAT_D32_FLOAT, { 1, 0 }, D3D11_USAGE_DEFAULT, D3D11_BIND_DEPTH_STENCIL, 0, 0 }; #pragma data_seg(".rasterizerDesc") static D3D11_RASTERIZER_DESC rasterizerDesc = { D3D11_FILL_SOLID, D3D11_CULL_NONE, TRUE, 0, 0.0f, 0.0f, TRUE, FALSE, FALSE, FALSE }; #pragma data_seg(".constantBufferDesc") static D3D11_BUFFER_DESC constantBufferDesc = { 16, D3D11_USAGE_DYNAMIC, D3D11_BIND_CONSTANT_BUFFER, D3D11_CPU_ACCESS_WRITE, 0, 0 }; #pragma data_seg(".particleBufferDesc") static D3D11_BUFFER_DESC particleBufferDesc = { PARTICLE_COUNT * PARTICLE_COUNT * PARTICLE_STRIDE, D3D11_USAGE_DEFAULT, D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE, 0, D3D11_RESOURCE_MISC_BUFFER_STRUCTURED, PARTICLE_STRIDE }; #pragma data_seg(".particleBufferDesc") static D3D11_SHADER_RESOURCE_VIEW_DESC particleSrvDesc = { DXGI_FORMAT_UNKNOWN, D3D11_SRV_DIMENSION_BUFFER, { 0, PARTICLE_COUNT * PARTICLE_COUNT } }; #pragma data_seg(".particleUavDesc") static D3D11_UNORDERED_ACCESS_VIEW_DESC particleUavDesc = { DXGI_FORMAT_UNKNOWN, D3D11_UAV_DIMENSION_BUFFER, 0, PARTICLE_COUNT * PARTICLE_COUNT, 0 }; #pragma data_seg(".backBufferRtvDesc") static D3D11_RENDER_TARGET_VIEW_DESC backBufferRtvDesc = { DXGI_FORMAT_R16G16B16A16_FLOAT, D3D11_RTV_DIMENSION_TEXTURE2DMS, { 0 } }; #pragma data_seg(".swapChainViewport") static D3D11_VIEWPORT swapChainViewport = { 0, 0, WIDTH, HEIGHT, 0.0f, 1.0f, }; #pragma data_seg(".alphaBlendDesc") static D3D11_BLEND_DESC alphaBlendDesc = { FALSE, FALSE, { TRUE, D3D11_BLEND_SRC_ALPHA, D3D11_BLEND_INV_SRC_ALPHA, D3D11_BLEND_OP_ADD, D3D11_BLEND_ONE, D3D11_BLEND_ONE, D3D11_BLEND_OP_ADD, D3D11_COLOR_WRITE_ENABLE_ALL, } };