void NeighborMax::InitRenderTarget(SetupContext& context) { if (!m_outputTexturesInited) { m_outputTexturesInited = true; using gxapi::eFormat; auto formatNeighborMax = eFormat::R8G8_UNORM; gxapi::RtvTexture2DArray rtvDesc; rtvDesc.activeArraySize = 1; rtvDesc.firstArrayElement = 0; rtvDesc.firstMipLevel = 0; rtvDesc.planeIndex = 0; gxapi::SrvTexture2DArray srvDesc; srvDesc.activeArraySize = 1; srvDesc.firstArrayElement = 0; srvDesc.numMipLevels = -1; srvDesc.mipLevelClamping = 0; srvDesc.mostDetailedMip = 0; srvDesc.planeIndex = 0; Texture2DDesc desc{ m_inputTexSrv.GetResource().GetWidth(), m_inputTexSrv.GetResource().GetHeight(), formatNeighborMax }; Texture2D neighbormax_tex = context.CreateTexture2D(desc, { true, true, false, false }); neighbormax_tex.SetName("Motion blur neighbormax tex"); m_neighbormax_rtv = context.CreateRtv(neighbormax_tex, formatNeighborMax, rtvDesc); } }
void BloomBlur::InitRenderTarget(SetupContext& context) { if (!m_outputTexturesInited) { m_outputTexturesInited = true; using gxapi::eFormat; auto formatBlur = eFormat::R16G16B16A16_FLOAT; gxapi::RtvTexture2DArray rtvDesc; rtvDesc.activeArraySize = 1; rtvDesc.firstArrayElement = 0; rtvDesc.firstMipLevel = 0; rtvDesc.planeIndex = 0; gxapi::SrvTexture2DArray srvDesc; srvDesc.activeArraySize = 1; srvDesc.firstArrayElement = 0; srvDesc.numMipLevels = -1; srvDesc.mipLevelClamping = 0; srvDesc.mostDetailedMip = 0; srvDesc.planeIndex = 0; Texture2DDesc desc{ m_inputTexSrv.GetResource().GetWidth(), m_inputTexSrv.GetResource().GetHeight(), formatBlur }; Texture2D blur_tex = context.CreateTexture2D(desc, { true, true, false, false }); blur_tex.SetName("Bloom blur tex"); m_blur_rtv = context.CreateRtv(blur_tex, formatBlur, rtvDesc); } }
void BrightLumPass::InitRenderTarget(SetupContext& context) { if (!m_outputTexturesInited) { m_outputTexturesInited = true; using gxapi::eFormat; auto formatBrightPass = eFormat::R16G16B16A16_FLOAT; auto formatLuminance = eFormat::R16_FLOAT; gxapi::RtvTexture2DArray rtvDesc; rtvDesc.activeArraySize = 1; rtvDesc.firstArrayElement = 0; rtvDesc.firstMipLevel = 0; rtvDesc.planeIndex = 0; gxapi::SrvTexture2DArray srvDesc; srvDesc.activeArraySize = 1; srvDesc.firstArrayElement = 0; srvDesc.numMipLevels = -1; srvDesc.mipLevelClamping = 0; srvDesc.mostDetailedMip = 0; srvDesc.planeIndex = 0; Texture2DDesc desc{ m_inputTexSrv.GetResource().GetWidth(), m_inputTexSrv.GetResource().GetHeight(), formatBrightPass }; Texture2D bright_pass_tex = context.CreateTexture2D(desc, { true, true, false, false }); bright_pass_tex.SetName("Bright pass tex"); m_bright_pass_rtv = context.CreateRtv(bright_pass_tex, formatBrightPass, rtvDesc); desc.format = formatLuminance; Texture2D luminance_tex = context.CreateTexture2D(desc, { true, true, false, false }); luminance_tex.SetName("Luminance tex"); m_luminance_rtv = context.CreateRtv(luminance_tex, formatLuminance, rtvDesc); } }
void Blend::Setup(SetupContext& context) { auto& target = this->GetInput<0>().Get(); gxapi::RtvTexture2DArray rtvDesc; rtvDesc.activeArraySize = 1; rtvDesc.firstArrayElement = 0; rtvDesc.firstMipLevel = 0; rtvDesc.planeIndex = 0; m_blendDest = context.CreateRtv(target, target.GetFormat(), rtvDesc); auto blendSrc = this->GetInput<1>().Get(); gxapi::SrvTexture2DArray srvDesc; srvDesc.activeArraySize = 1; srvDesc.firstArrayElement = 0; srvDesc.mipLevelClamping = 0; srvDesc.mostDetailedMip = 0; srvDesc.numMipLevels = 1; srvDesc.planeIndex = 0; m_blendSrc = context.CreateSrv(blendSrc, blendSrc.GetFormat(), srvDesc); gxapi::RenderTargetBlendState currBlendMode = this->GetInput<2>().Get(); this->GetOutput<0>().Set(target); if (!m_binder) { BindParameterDesc tex0ParamDesc; m_tex0Param = BindParameter(eBindParameterType::TEXTURE, 0); tex0ParamDesc.parameter = m_tex0Param; tex0ParamDesc.constantSize = 0; tex0ParamDesc.relativeAccessFrequency = 0; tex0ParamDesc.relativeChangeFrequency = 0; tex0ParamDesc.shaderVisibility = gxapi::eShaderVisiblity::PIXEL; BindParameterDesc sampBindParamDesc; sampBindParamDesc.parameter = BindParameter(eBindParameterType::SAMPLER, 0); sampBindParamDesc.constantSize = 0; sampBindParamDesc.relativeAccessFrequency = 0; sampBindParamDesc.relativeChangeFrequency = 0; sampBindParamDesc.shaderVisibility = gxapi::eShaderVisiblity::PIXEL; gxapi::StaticSamplerDesc samplerDesc; samplerDesc.shaderRegister = 0; samplerDesc.filter = gxapi::eTextureFilterMode::MIN_MAG_LINEAR_MIP_POINT; samplerDesc.addressU = gxapi::eTextureAddressMode::CLAMP; samplerDesc.addressV = gxapi::eTextureAddressMode::CLAMP; samplerDesc.addressW = gxapi::eTextureAddressMode::CLAMP; samplerDesc.mipLevelBias = 0.f; samplerDesc.registerSpace = 0; samplerDesc.shaderVisibility = gxapi::eShaderVisiblity::PIXEL; m_binder = context.CreateBinder({ tex0ParamDesc, sampBindParamDesc }, { samplerDesc }); } if (!m_shader.vs || m_shader.ps) { ShaderParts shaderParts; shaderParts.vs = true; shaderParts.ps = true; m_shader = context.CreateShader("Blend", shaderParts, ""); } if (m_renderTargetFormat != target.GetFormat() || m_blendMode != currBlendMode) { m_renderTargetFormat = target.GetFormat(); m_blendMode = currBlendMode; std::vector<gxapi::InputElementDesc> inputElementDesc = { gxapi::InputElementDesc("POSITION", 0, gxapi::eFormat::R32G32_FLOAT, 0, 0) }; gxapi::GraphicsPipelineStateDesc psoDesc; psoDesc.inputLayout.elements = inputElementDesc.data(); psoDesc.inputLayout.numElements = (unsigned)inputElementDesc.size(); psoDesc.rootSignature = m_binder.GetRootSignature(); psoDesc.vs = m_shader.vs; psoDesc.ps = m_shader.ps; psoDesc.rasterization = gxapi::RasterizerState(gxapi::eFillMode::SOLID, gxapi::eCullMode::DRAW_ALL); psoDesc.primitiveTopologyType = gxapi::ePrimitiveTopologyType::TRIANGLE; psoDesc.blending.alphaToCoverage = false; psoDesc.blending.independentBlending = false; psoDesc.blending.singleTarget = m_blendMode; psoDesc.numRenderTargets = 1; psoDesc.renderTargetFormats[0] = m_renderTargetFormat; m_PSO.reset(context.CreatePSO(psoDesc)); } }