void RasterizingShadowsComputeShader::setParameters( ID3D11DeviceContext& deviceContext, const float3& cameraPos, const Light& light, const Texture2DSpecBind< TexBind::ShaderResource, float4 >& rayOriginTexture, const Texture2DSpecBind< TexBind::ShaderResource, float4 >& surfaceNormalTexture, const int outputTextureWidth, const int outputTextureHeight ) { if ( !m_compiled ) throw std::exception( "RasterizingShadowsComputeShader::setParameters - Shader hasn't been compiled yet." ); std::shared_ptr< Texture2DSpecBind< TexBind::ShaderResource, float > > shadowMap; if ( light.getType() == Light::Type::SpotLight ) shadowMap = static_cast<const SpotLight&>( light ).getShadowMap(); { // Set input buffers and textures. const unsigned int resourceCount = 3; ID3D11ShaderResourceView* resources[ resourceCount ] = { rayOriginTexture.getShaderResourceView(), surfaceNormalTexture.getShaderResourceView(), shadowMap ? shadowMap->getShaderResourceView() : nullptr, }; deviceContext.CSSetShaderResources( 0, resourceCount, resources ); } { // Set constant buffer. D3D11_MAPPED_SUBRESOURCE mappedResource; ConstantBuffer* dataPtr; HRESULT result = deviceContext.Map( m_constantInputBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource ); if ( result < 0 ) throw std::exception( "RasterizingShadowsComputeShader::setParameters - mapping constant buffer to CPU memory failed." ); dataPtr = (ConstantBuffer*)mappedResource.pData; dataPtr->outputTextureSize = float2( (float)outputTextureWidth, (float)outputTextureHeight ); dataPtr->lightPosition = light.getPosition(); dataPtr->lightEmitterRadius = light.getEmitterRadius(); const SpotLight& spotLight = static_cast<const SpotLight&>( light ); dataPtr->shadowMapViewMatrix = spotLight.getShadowMapViewMatrix().getTranspose(); dataPtr->shadowMapProjectionMatrix = spotLight.getShadowMapProjectionMatrix().getTranspose(); dataPtr->lightConeMinDot = cos( spotLight.getConeAngle() ); dataPtr->lightDirection = spotLight.getDirection(); dataPtr->cameraPosition = cameraPos; deviceContext.Unmap( m_constantInputBuffer.Get(), 0 ); deviceContext.CSSetConstantBuffers( 0, 1, m_constantInputBuffer.GetAddressOf() ); } { // Set texture samplers. ID3D11SamplerState* samplerStates[] = { m_pointSamplerState.Get(), m_linearSamplerState.Get() }; deviceContext.CSSetSamplers( 0, 2, samplerStates ); } }
void GenerateMipmapMinValueComputeShader::setParameters( ID3D11DeviceContext& deviceContext, Texture2D< TexUsage::Default, TexBind::RenderTarget_UnorderedAccess_ShaderResource, float >& texture, const int srcMipLevel ) { if ( !m_compiled ) throw std::exception( "GenerateMipmapMinValueComputeShader::setParameters - Shader hasn't been compiled yet." ); const int mipmapCount = texture.getMipMapCountOnGpu(); if ( srcMipLevel + 1 >= mipmapCount ) throw std::exception( "GenerateMipmapMinValueComputeShader::setParameters - Source mipmap level is too high (source or destination mipmap is not exisiting)." ); { // Set input buffers and textures. const unsigned int resourceCount = 1; ID3D11ShaderResourceView* resources[ resourceCount ] = { texture.getShaderResourceView( srcMipLevel ) }; deviceContext.CSSetShaderResources( 0, resourceCount, resources ); } { // Set texture sampler. deviceContext.CSSetSamplers( 0, 1, m_samplerState.GetAddressOf() ); } }
void GenerateFirstRefractedRaysComputeShader::setParameters( ID3D11DeviceContext& deviceContext, const float3 cameraPos, const float3 viewportCenter, const float3 viewportUp, const float3 viewportRight, const float2 viewportSize, const Texture2DSpecBind< TexBind::ShaderResource, float4 >& positionTexture, const Texture2DSpecBind< TexBind::ShaderResource, float4 >& normalTexture, const Texture2DSpecBind< TexBind::ShaderResource, unsigned char >& roughnessTexture, const Texture2DSpecBind< TexBind::ShaderResource, unsigned char >& refractiveIndexTexture, const Texture2DSpecBind< TexBind::ShaderResource, uchar4 >& contributionTermTexture, const int outputTextureWidth, const int outputTextureHeight ) { if ( !m_compiled ) throw std::exception( "GenerateFirstRefractedRaysComputeShader::setParameters - Shader hasn't been compiled yet." ); { // Set input buffers and textures. m_resourceCount = 5 /*+ (int)refractiveIndexTextures.size()*/; std::vector< ID3D11ShaderResourceView* > resources; resources.reserve( m_resourceCount ); resources.push_back( positionTexture.getShaderResourceView() ); resources.push_back( normalTexture.getShaderResourceView() ); resources.push_back( roughnessTexture.getShaderResourceView() ); resources.push_back( refractiveIndexTexture.getShaderResourceView() ); resources.push_back( contributionTermTexture.getShaderResourceView() ); /*for ( int i = 0; i < refractiveIndexTextures .size(); ++i ) resources.push_back( refractiveIndexTextures[ i ]->getShaderResourceView() );*/ deviceContext.CSSetShaderResources( 0, m_resourceCount, resources.data() ); } D3D11_MAPPED_SUBRESOURCE mappedResource; ConstantBuffer* dataPtr; HRESULT result = deviceContext.Map( m_constantInputBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource ); if ( result < 0 ) throw std::exception( "GenerateFirstRefractedRaysComputeShader::setParameters - mapping constant buffer to CPU memory failed." ); dataPtr = (ConstantBuffer*)mappedResource.pData; dataPtr->cameraPos = cameraPos; dataPtr->viewportCenter = viewportCenter; dataPtr->viewportUp = viewportUp; dataPtr->viewportRight = viewportRight; dataPtr->viewportSizeHalf = viewportSize / 2.0f; dataPtr->outputTextureSize = float2( (float)outputTextureWidth, (float)outputTextureHeight ); // Padding. dataPtr->pad1 = 0.0f; dataPtr->pad2 = 0.0f; dataPtr->pad3 = 0.0f; dataPtr->pad4 = 0.0f; dataPtr->pad5 = float2( 0.0f, 0.0f ); deviceContext.Unmap( m_constantInputBuffer.Get(), 0 ); deviceContext.CSSetConstantBuffers( 0, 1, m_constantInputBuffer.GetAddressOf() ); ID3D11SamplerState* samplerStates[] = { m_samplerStateLinearFilter.Get() }; deviceContext.CSSetSamplers( 0, 1, samplerStates ); }
void GenerateMipmapMinValueComputeShader::unsetParameters( ID3D11DeviceContext& deviceContext ) { if ( !m_compiled ) throw std::exception( "GenerateMipmapMinValueComputeShader::unsetParameters - Shader hasn't been compiled yet." ); // Unset buffers and textures. ID3D11ShaderResourceView* nullResources[ 1 ] = { nullptr }; deviceContext.CSSetShaderResources( 0, 1, nullResources ); // Unset samplers. ID3D11SamplerState* nullSamplers[ 1 ] = { nullptr }; deviceContext.CSSetSamplers( 0, 1, nullSamplers ); }
void RaytracingSecondaryRaysComputeShader::unsetParameters( ID3D11DeviceContext& deviceContext ) { if ( !m_compiled ) throw std::exception( "RaytracingSecondaryRaysComputeShader::unsetParameters - Shader hasn't been compiled yet." ); // Unset buffers and textures. ID3D11ShaderResourceView* nullResources[ 16 ] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; deviceContext.CSSetShaderResources( 0, 16, nullResources ); // Unset samplers. ID3D11SamplerState* nullSamplers[ 1 ] = { nullptr }; deviceContext.CSSetSamplers( 0, 1, nullSamplers ); }
void ShadingComputeShader::setParameters( ID3D11DeviceContext& deviceContext, const float3& cameraPos, const std::shared_ptr< Texture2DSpecBind< TexBind::ShaderResource, float4 > > positionTexture, const std::shared_ptr< Texture2DSpecBind< TexBind::ShaderResource, uchar4 > > albedoTexture, const std::shared_ptr< Texture2DSpecBind< TexBind::ShaderResource, unsigned char > > metalnessTexture, const std::shared_ptr< Texture2DSpecBind< TexBind::ShaderResource, unsigned char > > roughnessTexture, const std::shared_ptr< Texture2DSpecBind< TexBind::ShaderResource, float4 > > normalTexture, const std::shared_ptr< Texture2DSpecBind< TexBind::ShaderResource, unsigned char > > illuminationTexture, const Light& light ) { if ( !m_compiled ) throw std::exception( "ShadingComputeShader::setParameters - Shader hasn't been compiled yet." ); { // Set input buffers and textures. const unsigned int resourceCount = 6; ID3D11ShaderResourceView* resources[ resourceCount ] = { positionTexture->getShaderResourceView(), albedoTexture->getShaderResourceView(), metalnessTexture->getShaderResourceView(), roughnessTexture->getShaderResourceView(), normalTexture->getShaderResourceView(), illuminationTexture->getShaderResourceView() }; deviceContext.CSSetShaderResources( 0, resourceCount, resources ); } { // Set constant buffer. D3D11_MAPPED_SUBRESOURCE mappedResource; ConstantBuffer* dataPtr; HRESULT result = deviceContext.Map( m_constantInputBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource ); if ( result < 0 ) throw std::exception( "ShadingComputeShader::setParameters - mapping constant buffer to CPU memory failed." ); dataPtr = (ConstantBuffer*)mappedResource.pData; dataPtr->cameraPos = cameraPos; dataPtr->pad1 = 0.0f; dataPtr->lightPosition = float4( light.getPosition(), 0.0f ); dataPtr->lightColor = float4( light.getColor(), 0.0f ); dataPtr->outputTextureSize = float2( (float)positionTexture->getWidth(), (float)positionTexture->getHeight() ); // #TODO: Size should be taken from real output texture, not one of inputs (right now, we are assuming they have the same size). deviceContext.Unmap( m_constantInputBuffer.Get(), 0 ); deviceContext.CSSetConstantBuffers( 0, 1, m_constantInputBuffer.GetAddressOf() ); } { // Set texture sampler. ID3D11SamplerState* samplers[] = { m_linearSamplerState.Get(), m_pointSamplerState.Get() }; deviceContext.CSSetSamplers( 0, 2, samplers ); } }
void RasterizingShadowsComputeShader::unsetParameters( ID3D11DeviceContext& deviceContext ) { if ( !m_compiled ) throw std::exception( "RasterizingShadowsComputeShader::unsetParameters - Shader hasn't been compiled yet." ); // Unset buffers and textures. ID3D11ShaderResourceView* nullResources[ 3 ] = {}; deviceContext.CSSetShaderResources( 0, 3, nullResources ); // Unset samplers. ID3D11SamplerState* nullSamplers[ 2 ] = {}; deviceContext.CSSetSamplers( 0, 2, nullSamplers ); }
void GenerateRefractedRaysComputeShader::setParameters( ID3D11DeviceContext& deviceContext, const unsigned int refractionLevel, const Texture2DSpecBind< TexBind::ShaderResource, float4 >& rayDirectionTexture, const Texture2DSpecBind< TexBind::ShaderResource, float4 >& rayHitPositionTexture, const Texture2DSpecBind< TexBind::ShaderResource, float4 >& rayHitNormalTexture, const Texture2DSpecBind< TexBind::ShaderResource, unsigned char >& rayHitRoughnessTexture, const Texture2DSpecBind< TexBind::ShaderResource, unsigned char >& rayHitRefractiveIndexTexture, const Texture2DSpecBind< TexBind::ShaderResource, uchar4 >& contributionTermTexture, const std::shared_ptr< Texture2DSpecBind< TexBind::ShaderResource, unsigned char > > prevRefractiveIndexTexture, // Only makes sense for refraction level >= 2. const std::shared_ptr< const Texture2DSpecBind< TexBind::ShaderResource, unsigned char > > currentRefractiveIndexTexture, const int outputTextureWidth, const int outputTextureHeight ) { if ( !m_compiled ) throw std::exception( "GenerateRefractedRaysComputeShader::setParameters - Shader hasn't been compiled yet." ); { // Set input buffers and textures. m_resourceCount = 8; std::vector< ID3D11ShaderResourceView* > resources; resources.reserve( m_resourceCount ); resources.push_back( rayDirectionTexture.getShaderResourceView() ); resources.push_back( rayHitPositionTexture.getShaderResourceView() ); resources.push_back( rayHitNormalTexture.getShaderResourceView() ); resources.push_back( rayHitRoughnessTexture.getShaderResourceView() ); resources.push_back( rayHitRefractiveIndexTexture.getShaderResourceView() ); resources.push_back( contributionTermTexture.getShaderResourceView() ); resources.push_back( prevRefractiveIndexTexture ? prevRefractiveIndexTexture->getShaderResourceView() : nullptr ); resources.push_back( currentRefractiveIndexTexture ? currentRefractiveIndexTexture->getShaderResourceView() : nullptr ); deviceContext.CSSetShaderResources( 0, m_resourceCount, resources.data() ); } D3D11_MAPPED_SUBRESOURCE mappedResource; ConstantBuffer* dataPtr; HRESULT result = deviceContext.Map( m_constantInputBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource ); if ( result < 0 ) throw std::exception( "GenerateRefractedRaysComputeShader::setParameters - mapping constant buffer to CPU memory failed." ); dataPtr = (ConstantBuffer*)mappedResource.pData; dataPtr->refractionLevel = refractionLevel; dataPtr->outputTextureSize = float2( (float)outputTextureWidth, (float)outputTextureHeight ); deviceContext.Unmap( m_constantInputBuffer.Get(), 0 ); deviceContext.CSSetConstantBuffers( 0, 1, m_constantInputBuffer.GetAddressOf() ); ID3D11SamplerState* samplerStates[] = { m_samplerStateLinearFilter.Get() }; deviceContext.CSSetSamplers( 0, 1, samplerStates ); }
void GenerateRefractedRaysComputeShader::unsetParameters( ID3D11DeviceContext& deviceContext ) { if ( !m_compiled ) throw std::exception( "GenerateRefractedRaysComputeShader::unsetParameters - Shader hasn't been compiled yet." ); // Unset buffers and textures. std::vector< ID3D11ShaderResourceView* > nullResources; nullResources.resize( m_resourceCount ); for ( int i = 0; i < m_resourceCount; ++i ) nullResources[ i ] = nullptr; deviceContext.CSSetShaderResources( 0, (int)nullResources.size(), nullResources.data() ); ID3D11SamplerState* nullSampler[ 1 ] = { nullptr }; deviceContext.CSSetSamplers( 0, 1, nullSampler ); }
void RaytracingSecondaryRaysComputeShader::setParameters( ID3D11DeviceContext& deviceContext, const Texture2DSpecBind< TexBind::UnorderedAccess_ShaderResource, float4 >& rayOriginsTexture, const Texture2DSpecBind< TexBind::UnorderedAccess_ShaderResource, float4 >& rayDirectionsTexture, const BlockMesh& mesh, const float43& worldMatrix, const float3 boundingBoxMin, const float3 boundingBoxMax, const Texture2DSpecBind< TexBind::ShaderResource, unsigned char >& alphaTexture, const Texture2DSpecBind< TexBind::ShaderResource, uchar4 >& emissiveTexture, const Texture2DSpecBind< TexBind::ShaderResource, uchar4 >& albedoTexture, const Texture2DSpecBind< TexBind::ShaderResource, uchar4 >& normalTexture, const Texture2DSpecBind< TexBind::ShaderResource, unsigned char >& metalnessTexture, const Texture2DSpecBind< TexBind::ShaderResource, unsigned char >& roughnessTexture, const Texture2DSpecBind< TexBind::ShaderResource, unsigned char >& indexOfRefractionTexture, const int outputTextureWidth, const int outputTextureHeight ) { if ( !m_compiled ) throw std::exception( "RaytracingSecondaryRaysComputeShader::setParameters - Shader hasn't been compiled yet." ); { // Set input buffers and textures. const unsigned int resourceCount = 16; ID3D11ShaderResourceView* resources[ resourceCount ] = { rayOriginsTexture.getShaderResourceView(), rayDirectionsTexture.getShaderResourceView(), mesh.getVertexBufferResource(), mesh.getNormalBufferResource(), mesh.getTangentBufferResource(), !mesh.getTexcoordBufferResources().empty() ? mesh.getTexcoordBufferResources().front() : nullptr, mesh.getTriangleBufferResource(), mesh.getBvhTreeBufferNodesShaderResourceView().Get(), mesh.getBvhTreeBufferNodesExtentsShaderResourceView().Get(), //mesh.getBvhTreeBufferTrianglesShaderResourceView().Get(), alphaTexture.getShaderResourceView(), emissiveTexture.getShaderResourceView(), albedoTexture.getShaderResourceView(), normalTexture.getShaderResourceView(), metalnessTexture.getShaderResourceView(), roughnessTexture.getShaderResourceView(), indexOfRefractionTexture.getShaderResourceView() }; deviceContext.CSSetShaderResources( 0, resourceCount, resources ); } { // Set constant buffer. D3D11_MAPPED_SUBRESOURCE mappedResource; ConstantBuffer* dataPtr; HRESULT result = deviceContext.Map( m_constantInputBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource ); if ( result < 0 ) throw std::exception( "RaytracingSecondaryRaysComputeShader::setParameters - mapping constant buffer to CPU memory failed." ); dataPtr = (ConstantBuffer*)mappedResource.pData; dataPtr->localToWorldMatrix = float44( worldMatrix ).getTranspose(); // Transpose from row-major to column-major to fit each column in one register. dataPtr->worldToLocalMatrix = float44( worldMatrix.getScaleOrientationTranslationInverse() ).getTranspose(); // Transpose from row-major to column-major to fit each column in one register. dataPtr->boundingBoxMin = boundingBoxMin; dataPtr->boundingBoxMax = boundingBoxMax; dataPtr->outputTextureSize = float2( (float)outputTextureWidth, (float)outputTextureHeight ); // Padding. dataPtr->pad1 = 0.0f; dataPtr->pad2 = 0.0f; deviceContext.Unmap( m_constantInputBuffer.Get(), 0 ); deviceContext.CSSetConstantBuffers( 0, 1, m_constantInputBuffer.GetAddressOf() ); } { // Set texture sampler. deviceContext.CSSetSamplers( 0, 1, m_samplerState.GetAddressOf() ); } }