void MeshRenderer::LoadShaders() { // Load the mesh shaders meshDepthVS = CompileVSFromFile(device, L"DepthOnly.hlsl", "VS", "vs_5_0"); meshVS = CompileVSFromFile(device, L"Mesh.hlsl", "VS", "vs_5_0"); meshPS = CompilePSFromFile(device, L"Mesh.hlsl", "PS", "ps_5_0"); fullScreenVS = CompileVSFromFile(device, L"EVSMConvert.hlsl", "FullScreenVS"); CompileOptions opts; opts.Add("MSAASamples_", ShadowMSAASamples); evsmConvertPS = CompilePSFromFile(device, L"EVSMConvert.hlsl", "ConvertToEVSM", "ps_5_0", opts); opts.Reset(); opts.Add("Horizontal_", 1); opts.Add("Vertical_", 0); opts.Add("SampleRadius_", SampleRadius); evsmBlurH = CompilePSFromFile(device, L"EVSMConvert.hlsl", "BlurEVSM", "ps_5_0", opts); opts.Reset(); opts.Add("Horizontal_", 0); opts.Add("Vertical_", 1); opts.Add("SampleRadius_", SampleRadius); evsmBlurV = CompilePSFromFile(device, L"EVSMConvert.hlsl", "BlurEVSM", "ps_5_0", opts); opts.Reset(); opts.Add("MSAA_", 0); depthReductionInitialCS[0] = CompileCSFromFile(device, L"DepthReduction.hlsl", "DepthReductionInitialCS", "cs_5_0", opts); opts.Reset(); opts.Add("MSAA_", 1); depthReductionInitialCS[1] = CompileCSFromFile(device, L"DepthReduction.hlsl", "DepthReductionInitialCS", "cs_5_0", opts); depthReductionCS = CompileCSFromFile(device, L"DepthReduction.hlsl", "DepthReductionCS"); }
static void GetTextureData(ID3D11Device* device, ID3D11ShaderResourceView* textureSRV, DXGI_FORMAT outFormat, TextureData<T>& texData) { static ComputeShaderPtr decodeTextureCS; static ComputeShaderPtr decodeTextureArrayCS; static const uint32 TGSize = 16; if(decodeTextureCS.Valid() == false) { CompileOptions opts; opts.Add("TGSize_", TGSize); const std::wstring shaderPath = SampleFrameworkDir() + L"Shaders\\DecodeTextureCS.hlsl"; decodeTextureCS = CompileCSFromFile(device, shaderPath.c_str(), "DecodeTextureCS", "cs_5_0", opts); decodeTextureArrayCS = CompileCSFromFile(device, shaderPath.c_str(), "DecodeTextureArrayCS", "cs_5_0", opts); } ID3D11Texture2DPtr texture; textureSRV->GetResource(reinterpret_cast<ID3D11Resource**>(&texture)); D3D11_TEXTURE2D_DESC texDesc; texture->GetDesc(&texDesc); D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; textureSRV->GetDesc(&srvDesc); ID3D11ShaderResourceViewPtr sourceSRV = textureSRV; uint32 arraySize = texDesc.ArraySize; if(srvDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBE || srvDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBEARRAY) { srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; srvDesc.Texture2DArray.ArraySize = arraySize; srvDesc.Texture2DArray.FirstArraySlice = 0; srvDesc.Texture2DArray.MostDetailedMip = 0; srvDesc.Texture2DArray.MipLevels = -1; DXCall(device->CreateShaderResourceView(texture, &srvDesc, &sourceSRV)); } D3D11_TEXTURE2D_DESC decodeTextureDesc; decodeTextureDesc.Width = texDesc.Width; decodeTextureDesc.Height = texDesc.Height; decodeTextureDesc.ArraySize = arraySize; decodeTextureDesc.BindFlags = D3D11_BIND_UNORDERED_ACCESS; decodeTextureDesc.Format = outFormat; decodeTextureDesc.MipLevels = 1; decodeTextureDesc.MiscFlags = 0; decodeTextureDesc.SampleDesc.Count = 1; decodeTextureDesc.SampleDesc.Quality = 0; decodeTextureDesc.Usage = D3D11_USAGE_DEFAULT; decodeTextureDesc.CPUAccessFlags = 0; ID3D11Texture2DPtr decodeTexture; DXCall(device->CreateTexture2D(&decodeTextureDesc, nullptr, &decodeTexture)); ID3D11UnorderedAccessViewPtr decodeTextureUAV; DXCall(device->CreateUnorderedAccessView(decodeTexture, nullptr, &decodeTextureUAV)); ID3D11DeviceContextPtr context; device->GetImmediateContext(&context); SetCSInputs(context, sourceSRV); SetCSOutputs(context, decodeTextureUAV); SetCSShader(context, arraySize > 1 ? decodeTextureArrayCS : decodeTextureCS); context->Dispatch(DispatchSize(TGSize, texDesc.Width), DispatchSize(TGSize, texDesc.Height), arraySize); ClearCSInputs(context); ClearCSOutputs(context); StagingTexture2D stagingTexture; stagingTexture.Initialize(device, texDesc.Width, texDesc.Height, outFormat, 1, 1, 0, arraySize); context->CopyResource(stagingTexture.Texture, decodeTexture); texData.Init(texDesc.Width, texDesc.Height, arraySize); for(uint32 slice = 0; slice < arraySize; ++slice) { uint32 pitch = 0; const uint8* srcData = reinterpret_cast<const uint8*>(stagingTexture.Map(context, slice, pitch)); Assert_(pitch >= texDesc.Width * sizeof(T)); const uint32 sliceOffset = texDesc.Width * texDesc.Height * slice; for(uint32 y = 0; y < texDesc.Height; ++y) { const T* rowData = reinterpret_cast<const T*>(srcData); for(uint32 x = 0; x < texDesc.Width; ++x) texData.Texels[y * texDesc.Width + x + sliceOffset] = rowData[x]; srcData += pitch; } } }
SH9Color ProjectCubemapToSH9Color(ID3D11DeviceContext* context, ID3D11ShaderResourceView* cubeMap) { ID3D11Texture2DPtr srcTexture; cubeMap->GetResource(reinterpret_cast<ID3D11Resource**>(&srcTexture)); D3D11_TEXTURE2D_DESC srcDesc; srcTexture->GetDesc(&srcDesc); ID3D11DevicePtr device; context->GetDevice(&device); ID3D11Texture2DPtr tempTexture; D3D11_TEXTURE2D_DESC tempDesc = srcDesc; tempDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; tempDesc.MipLevels = 1; tempDesc.BindFlags = D3D11_BIND_UNORDERED_ACCESS; tempDesc.Usage = D3D11_USAGE_DEFAULT; DXCall(device->CreateTexture2D(&tempDesc, NULL, &tempTexture)); ID3D11UnorderedAccessViewPtr tempUAV; DXCall(device->CreateUnorderedAccessView(tempTexture, NULL, &tempUAV)); ID3D11ShaderResourceViewPtr tempSRV; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; srvDesc.Format = srcDesc.Format; srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; srvDesc.Texture2DArray.MostDetailedMip = 0; srvDesc.Texture2DArray.MipLevels = srcDesc.MipLevels; srvDesc.Texture2DArray.FirstArraySlice = 0; srvDesc.Texture2DArray.ArraySize = 6; DXCall(device->CreateShaderResourceView(srcTexture, &srvDesc, &tempSRV)); static const UINT32 TGSize = 1024; static ID3D11ComputeShaderPtr decodeShader; if(decodeShader.GetInterfacePtr() == NULL) { CompileOptions opts; opts.Add("TGSize_", TGSize); decodeShader.Attach(CompileCSFromFile(device, L"SampleFramework11\\Shaders\\DecodeTextureCS.hlsl", "DecodeTextureCS", "cs_5_0", opts.Defines())); } ID3D11ShaderResourceView* srvs[1] = { tempSRV }; context->CSSetShaderResources(0, 1, srvs); ID3D11UnorderedAccessView* uavs[1] = { tempUAV }; context->CSSetUnorderedAccessViews(0, 1, uavs, NULL); context->CSSetShader(decodeShader, NULL, 0); context->Dispatch(DispatchSize(TGSize, srcDesc.Width), srcDesc.Height, 6); float red[9]; float green[9]; float blue[9]; DXCall(D3DX11SHProjectCubeMap(context, 3, tempTexture, red, green, blue)); SH9Color sh; for(UINT_PTR i = 0; i < 9; ++i) sh.c[i] = XMVectorSet(red[i], green[i], blue[i], 0.0f); return sh; }
void MeshRenderer::LoadShaders() { _totalShaderNum = (int)pow(2, 5) + (int)pow(2, 8) + 8; CompileOptions opts; // Mesh.hlsl const char *vsDescs[] = { "UseNormalMapping_", "UseAlbedoMap_", "UseMetallicMap_", "UseRoughnessMap_", "UseEmissiveMap_" }; const char *psDescs[] = { "UseNormalMapping_", "UseAlbedoMap_", "UseMetallicMap_", "UseRoughnessMap_", "UseEmissiveMap_", "CreateCubemap_", "CentroidSampling_", "IsGBuffer_" }; GenVSShaderPermutations(_device, L"Mesh.hlsl", "VS", vsDescs, _countof(vsDescs), _meshVertexShaders); GenPSShaderPermutations(_device, L"Mesh.hlsl", "PS", psDescs, _countof(psDescs), _meshPixelShaders); // DepthOnly.hlsl _meshDepthVS = CompileVSFromFile(_device, L"DepthOnly.hlsl", "VS", "vs_5_0"); if (RenderShaderProgress(_curShaderNum++, _totalShaderNum) == false) return; // EVSMConvert.hlsl _fullScreenVS = CompileVSFromFile(_device, L"EVSMConvert.hlsl", "FullScreenVS"); if (RenderShaderProgress(_curShaderNum++, _totalShaderNum) == false) return; opts.Reset(); opts.Add("MSAASamples_", ShadowMSAASamples); _evsmConvertPS = CompilePSFromFile(_device, L"EVSMConvert.hlsl", "ConvertToEVSM", "ps_5_0", opts); if (RenderShaderProgress(_curShaderNum++, _totalShaderNum) == false) return; opts.Reset(); opts.Add("Horizontal_", 1); opts.Add("Vertical_", 0); opts.Add("SampleRadius_", SampleRadius); _evsmBlurH = CompilePSFromFile(_device, L"EVSMConvert.hlsl", "BlurEVSM", "ps_5_0", opts); if (RenderShaderProgress(_curShaderNum++, _totalShaderNum) == false) return; opts.Reset(); opts.Add("Horizontal_", 0); opts.Add("Vertical_", 1); opts.Add("SampleRadius_", SampleRadius); _evsmBlurV = CompilePSFromFile(_device, L"EVSMConvert.hlsl", "BlurEVSM", "ps_5_0", opts); if (RenderShaderProgress(_curShaderNum++, _totalShaderNum) == false) return; // DepthReduction.hlsl opts.Reset(); opts.Add("MSAA_", 0); _depthReductionInitialCS[0] = CompileCSFromFile(_device, L"DepthReduction.hlsl", "DepthReductionInitialCS", "cs_5_0", opts); if (RenderShaderProgress(_curShaderNum++, _totalShaderNum) == false) return; opts.Reset(); opts.Add("MSAA_", 1); _depthReductionInitialCS[1] = CompileCSFromFile(_device, L"DepthReduction.hlsl", "DepthReductionInitialCS", "cs_5_0", opts); if (RenderShaderProgress(_curShaderNum++, _totalShaderNum) == false) return; _depthReductionCS = CompileCSFromFile(_device, L"DepthReduction.hlsl", "DepthReductionCS"); if (RenderShaderProgress(_curShaderNum++, _totalShaderNum) == false) return; }