void RenderToVolumeTexture(const Ptr<Texture> & volumeTexture) { auto rc = Global::GetRenderEngine()->GetRenderContext(); auto & quadVBs = GetQuadVBs(); auto & quadIB = GetQuadIB(); RenderViewport vp; vp.topLeftX = 0.0f; vp.topLeftY = 0.0f; vp.width = static_cast<float>(volumeTexture->GetDesc().width); vp.height = static_cast<float>(volumeTexture->GetDesc().height); vp.minDepth = 0.0f; vp.maxDepth = 1.0f; rc->SetViewport(vp); float2 uvMap[4]; uvMap[0] = float2(0.0f, 0.0f); uvMap[1] = float2(1.0f, 0.0f); uvMap[2] = float2(0.0f, 1.0f); uvMap[3] = float2(1.0f, 1.0f); auto uvBufMappedData = quadVBs[1]->Map(MAP_WRITE_DISCARD); memcpy(uvBufMappedData.pData, uvMap, sizeof(float2) * 4); quadVBs[1]->UnMap(); // Set vbs, ib rc->SetVertexBuffer(quadVBs); rc->SetIndexBuffer(quadIB); rc->SetPrimitiveTopology(PRIMITIVE_TOPOLOGY_TRIANGLELIST); // Set rtv rc->SetRenderTargets({ volumeTexture->GetRenderTargetView(0, 0, volumeTexture->GetDesc().depth) }); // Set dsv rc->SetDepthStencilState(DepthStencilStateTemplate<false>::Get()); // Bind shader auto vs = Shader::FindOrCreate<RenderToVolumeTextureVS>(); auto gs = Shader::FindOrCreate<RenderToVolumeTextureGS>(); vs->Flush(); gs->Flush(); // Draw rc->DrawIndexedInstanced(quadIB->GetDesc().numElements, volumeTexture->GetDesc().depth, 0, 0, 0); rc->SetDepthStencilState(nullptr); rc->ResetShader(SHADER_GS); }
void RenderingDevice::SetMaterial(const Material &material) { SetRasterizerState(material.GetRasterizerState()); SetBlendState(material.GetBlendState()); SetDepthStencilState(material.GetDepthStencilState()); for (size_t i = 0; i < material.GetSamplers().size(); ++i) { auto& sampler = material.GetSamplers()[i]; if (sampler.GetTexture()) { D3DLOG(mDevice->SetTexture(i, sampler.GetTexture()->GetDeviceTexture())); } else { D3DLOG(mDevice->SetTexture(i, nullptr)); } SetSamplerState(i, sampler.GetState()); } // Free up the texture bindings of the samplers currently being used for (size_t i = material.GetSamplers().size(); i < mUsedSamplers; ++i) { D3DLOG(mDevice->SetTexture(i, nullptr)); } mUsedSamplers = material.GetSamplers().size(); material.GetVertexShader()->Bind(); material.GetPixelShader()->Bind(); }
void OpenGLEngine::Draw (int x, int y, glm::vec4 const& color, std::string const& message) { if (message.length () > 0) { int vx, vy, vw, vh; GetViewport (vx, vy, vw, vh); m_ActiveFont->SetStringData (vw, vh, x, y, color, message); Update (m_ActiveFont->GetTextEffect () ->GetTranslate ()); Update (m_ActiveFont->GetTextEffect () ->GetColor ()); Update (m_ActiveFont->GetVertexBuffer ()); std::shared_ptr<BlendState> blendState = GetBlendState (); std::shared_ptr<DepthStencilState> depthState = GetDepthStencilState (); std::shared_ptr<RasterizerState> rasterizerState = GetRasterizerState (); SetDefaultBlendState (); SetDefaultDepthStencilState (); SetDefaultRasterizerState (); Draw (m_ActiveFont->GetVertexBuffer (), m_ActiveFont->GetIndexBuffer (), m_ActiveFont->GetTextEffect ()); SetBlendState (blendState); SetDepthStencilState (depthState); SetRasterizerState (rasterizerState); } }
void D3D11GraphicsDeviceStateManager::SetDefaultFrontFaceRendering() { if( locked ) return; SetRasterizerState( default_rasterizer_state ); SetDepthStencilState( default_depth_stencil_state ); }
void D3D11GraphicsDeviceStateManager::SetSpriteRendering( const BlendType::GRAPHICS_DEVICE_STATE_MANAGER_BLEND_TYPE blend_type ) { if( locked ) return; SetRasterizerState( sprite_rasterizer_state ); SetDepthStencilState( sprite_depth_stencil_state ); SetBlendType( blend_type ); }
void D3D11GraphicsDeviceStateManager::SetParticleRendering() { if( locked ) return; SetRasterizerState( sprite_rasterizer_state ); SetDepthStencilState( particle_depth_stencil_state ); EnableAdditiveBlending(); }
void SkyBox::Render(const Ptr<RenderTargetView> & target, const Ptr<DepthStencilView> & dsv, const Ptr<RenderView> & view) { if (!_tex) return; auto rc = Global::GetRenderEngine()->GetRenderContext(); auto translationMat = translation(view->GetCamera()->GetPos()); auto transformMat = mul(translationMat, view->GetCamera()->GetViewProjMatrix()); auto vs = Shader::FindOrCreate<SkyBoxVS>(); auto ps = Shader::FindOrCreate<SkyBoxPS>(); vs->SetScalar("transform", transformMat); ps->SetSRV("skyBoxTex", _tex->GetShaderResourceView(0, 0, 0, 0, true)); ps->SetSampler("linearSampler", SamplerTemplate<>::Get()); vs->Flush(); ps->Flush(); rc->SetViewport(GetTextureQuadViewport(target->GetResource()->Cast<Texture>())); rc->SetRenderTargets({ target }); rc->SetDepthStencil(dsv); rc->SetRasterizerState(RasterizerStateTemplate<FILL_SOLID, CULL_NONE>::Get()); rc->SetDepthStencilState(DepthStencilStateTemplate<true, DEPTH_WRITE_ZERO, COMPARISON_LESS_EQUAL>::Get()); rc->SetVertexBuffer(_sphereMesh->GetRenderData()->GetMeshElements()[0]->GetVertexBuffer()); rc->SetIndexBuffer(_sphereMesh->GetRenderData()->GetMeshElements()[0]->GetIndexBuffer()); rc->SetPrimitiveTopology(PRIMITIVE_TOPOLOGY_TRIANGLELIST); rc->DrawIndexed(0, 0); rc->SetRasterizerState(nullptr); rc->SetDepthStencilState(nullptr); }
void TextureFilter( const Ptr<ShaderResourceView> & src, const Ptr<RenderTargetView> & dst, const std::vector<float2> & uvOffsets, const std::vector<float> & weights, const Ptr<class Sampler> & sampler) { ToyGE_ASSERT(uvOffsets.size() == weights.size()); ToyGE_ASSERT(src); ToyGE_ASSERT(dst); int32_t numSamples = (int32_t)uvOffsets.size(); if (numSamples <= 0) return; auto rc = Global::GetRenderEngine()->GetRenderContext(); rc->SetViewport(GetTextureQuadViewport(dst->GetResource()->Cast<Texture>())); auto filterVS = Shader::FindOrCreate<FilterVS>({ { "NUM_SAMPLES", std::to_string(numSamples) } }); auto filterPS = Shader::FindOrCreate<FilterPS>({ { "NUM_SAMPLES", std::to_string(numSamples) } }); filterVS->SetScalar("samplesOffsets", &uvOffsets[0], (int32_t)(sizeof(uvOffsets[0]) * uvOffsets.size())); filterVS->Flush(); filterPS->SetScalar("samplesWeights", &weights[0], (int32_t)(sizeof(weights[0]) * weights.size())); filterPS->SetSRV("filterTex", src); filterPS->SetSampler("filterSampler", sampler ? sampler : SamplerTemplate<>::Get()); filterPS->Flush(); rc->SetRenderTargets({ dst }); rc->SetDepthStencil(nullptr); rc->SetDepthStencilState(DepthStencilStateTemplate<false>::Get()); rc->SetVertexBuffer({ GetQuadVBs()[0] }); rc->SetIndexBuffer(GetQuadIB()); rc->SetPrimitiveTopology(PRIMITIVE_TOPOLOGY_TRIANGLELIST); rc->DrawIndexed(0, 0); }
void DrawQuad( const std::vector< Ptr<class RenderTargetView> > & rtvs, float topLeftX, float topLeftY, float width, float height, float topLeftU, float topLeftV, float uvWidth, float uvHeight, const Ptr<class DepthStencilView> & dsv) { /*if (rtvs.size() == 0) return;*/ auto & quadVBs = GetQuadVBs(); auto & quadIB = GetQuadIB(); auto rc = Global::GetRenderEngine()->GetRenderContext(); // Viewport if (width == 0.0f) { if (rtvs.size() > 0) { auto tex = rtvs[0]->GetResource()->Cast<Texture>(); auto & mipSize = tex->GetMipSize(rtvs[0]->Cast<TextureRenderTargetView>()->mipLevel); width = (float)mipSize.x(); } else if (dsv) { auto tex = dsv->GetResource()->Cast<Texture>(); auto & mipSize = tex->GetMipSize(dsv->Cast<TextureDepthStencilView>()->mipLevel); width = (float)mipSize.x(); } } if (height == 0.0f) { if (rtvs.size() > 0) { auto tex = rtvs[0]->GetResource()->Cast<Texture>(); auto & mipSize = tex->GetMipSize(rtvs[0]->Cast<TextureRenderTargetView>()->mipLevel); height = (float)mipSize.y(); } else if (dsv) { auto tex = dsv->GetResource()->Cast<Texture>(); auto & mipSize = tex->GetMipSize(dsv->Cast<TextureDepthStencilView>()->mipLevel); height = (float)mipSize.y(); } } RenderViewport vp; vp.topLeftX = static_cast<float>(topLeftX); vp.topLeftY = static_cast<float>(topLeftY); vp.width = static_cast<float>(width); vp.height = static_cast<float>(height); vp.minDepth = 0.0f; vp.maxDepth = 1.0f; rc->SetViewport(vp); // Update uvs float2 uvMap[4]; uvMap[0] = float2(topLeftU, topLeftV); uvMap[1] = float2(topLeftU + uvWidth, topLeftV); uvMap[2] = float2(topLeftU, topLeftV + uvHeight); uvMap[3] = float2(topLeftU + uvWidth, topLeftV + uvHeight); auto uvBufMappedData = quadVBs[1]->Map(MAP_WRITE_DISCARD); memcpy(uvBufMappedData.pData, uvMap, sizeof(float2) * 4); quadVBs[1]->UnMap(); // Set vbs, ib rc->SetVertexBuffer(quadVBs); rc->SetIndexBuffer(quadIB); rc->SetPrimitiveTopology(PRIMITIVE_TOPOLOGY_TRIANGLELIST); // Set rtv rc->SetRenderTargets(rtvs); // Set dsv rc->SetDepthStencil(dsv); if (!dsv) rc->SetDepthStencilState(DepthStencilStateTemplate<false>::Get()); // Bind shader auto drawQuadVS = Shader::FindOrCreate<DrawQuadVS>(); drawQuadVS->Flush(); // Draw rc->DrawIndexed(0, 0); if (!dsv) rc->SetDepthStencilState(nullptr); }
void ImageBasedLensFlare::LensBlur(const Ptr<Texture> & setupTex, const Ptr<Texture> & target) { int32_t tileSize = 9; //Extract Sprite Points int32_t extractWidth = (setupTex->GetDesc().width + tileSize - 1) / tileSize; int32_t extractHeight = (setupTex->GetDesc().height + tileSize - 1) / tileSize; RenderBufferDesc spPointsBufDesc; spPointsBufDesc.bindFlag = BUFFER_BIND_SHADER_RESOURCE | BUFFER_BIND_UNORDERED_ACCESS; spPointsBufDesc.elementSize = sizeof(float2) + sizeof(float3); spPointsBufDesc.numElements = extractWidth * extractHeight; spPointsBufDesc.cpuAccess = 0; spPointsBufDesc.bStructured = true; auto spPointsBufRef = BufferPool::Instance().FindFree(spPointsBufDesc); auto spPointsBuf = spPointsBufRef->Get()->Cast<RenderBuffer>(); { auto ps = Shader::FindOrCreate<ExtractSpritePointsPS>(); ps->SetScalar("spriteThreshold", _spriteThreshold); ps->SetSRV("setupTex", setupTex->GetShaderResourceView()); ps->SetUAV("spPointsBuf", spPointsBuf->GetUnorderedAccessView(0, 0, RENDER_FORMAT_UNKNOWN, BUFFER_UAV_APPEND)); ps->Flush(); DrawQuad({}, 0.0f, 0.0f, (float)extractWidth, (float)extractHeight); } //Render Sprites if (!_indirectAgsBuf) { RenderBufferDesc indirectArgsBufDesc; indirectArgsBufDesc.bindFlag = BUFFER_BIND_INDIRECT_ARGS; indirectArgsBufDesc.elementSize = 16; indirectArgsBufDesc.numElements = 1; indirectArgsBufDesc.cpuAccess = 0; indirectArgsBufDesc.bStructured = false; uint32_t initData[] = { 0, 1, 0, 0 }; _indirectAgsBuf = Global::GetRenderEngine()->GetRenderFactory()->CreateBuffer(); _indirectAgsBuf->SetDesc(indirectArgsBufDesc); _indirectAgsBuf->Init(initData); } spPointsBuf->CopyStructureCountTo(_indirectAgsBuf, 0, 0, spPointsBuf->GetDesc().numElements, RENDER_FORMAT_UNKNOWN, BUFFER_UAV_APPEND); { auto vs = Shader::FindOrCreate<LensBlurVS>(); auto gs = Shader::FindOrCreate<LensBlurGS>(); auto ps = Shader::FindOrCreate<LensBlurPS>(); vs->SetScalar("texSize", target->GetTexSize()); gs->SetScalar("texSize", target->GetTexSize()); gs->SetScalar("flareIntensity", _flareIntensity); vs->SetSRV("spPointsRenderBuf", spPointsBuf->GetShaderResourceView(0, 0, RENDER_FORMAT_UNKNOWN)); auto lensTexAsset = Asset::Find<TextureAsset>("Textures/Bokeh_Circle.dds"); if (!lensTexAsset->IsInit()) lensTexAsset->Init(); auto lensTex = lensTexAsset->GetTexture(); ps->SetSRV("lensTex", lensTex->GetShaderResourceView()); ps->SetSampler("linearSampler", SamplerTemplate<>::Get()); vs->Flush(); gs->Flush(); ps->Flush(); auto rc = Global::GetRenderEngine()->GetRenderContext(); rc->SetVertexBuffer({}); rc->SetIndexBuffer(nullptr); rc->SetPrimitiveTopology(PRIMITIVE_TOPOLOGY_POINTLIST); rc->SetViewport(GetTextureQuadViewport(target)); rc->SetRenderTargets({ target->GetRenderTargetView(0, 0, 1) }); rc->SetDepthStencil(nullptr); rc->SetDepthStencilState(DepthStencilStateTemplate<false>::Get()); rc->SetBlendState(BlendStateTemplate<false, false, true, BLEND_PARAM_SRC_ALPHA, BLEND_PARAM_ONE, BLEND_OP_ADD>::Get()); rc->DrawInstancedIndirect(_indirectAgsBuf, 0); rc->ResetShader(SHADER_GS); rc->SetBlendState(nullptr); } }
void SSR::Render(const Ptr<RenderView> & view) { auto sceneTex = view->GetViewRenderContext()->GetSharedTexture("RenderResult"); auto sceneClipDepth = view->GetViewRenderContext()->GetSharedTexture("SceneClipDepth"); auto gbuffer0 = view->GetViewRenderContext()->GetSharedTexture("GBuffer0"); auto gbuffer1 = view->GetViewRenderContext()->GetSharedTexture("GBuffer1"); TextureDesc ssrDesc = sceneTex->GetDesc(); ssrDesc.format = RENDER_FORMAT_R16G16B16A16_FLOAT; auto ssrResultTexRef = TexturePool::Instance().FindFree({ TEXTURE_2D, ssrDesc }); auto ssrResult = ssrResultTexRef->Get()->Cast<Texture>(); auto tmpDepthTexRef = TexturePool::Instance().FindFree({ TEXTURE_2D, sceneClipDepth->GetDesc() }); auto tmpDepthTex = tmpDepthTexRef->Get()->Cast<Texture>(); sceneClipDepth->CopyTo(tmpDepthTex, 0, 0, 0, 0, 0, 0, 0); auto ps = Shader::FindOrCreate<ScreenSpaceReflectionPS>(); view->BindShaderParams(ps); ps->SetScalar("frameCount", Global::GetInfo()->frameCount); ps->SetScalar("ssrMaxRoughness", _ssrMaxRoughness); ps->SetScalar("ssrIntensity", _ssrIntensity); ps->SetSRV("sceneTex", sceneTex->GetShaderResourceView()); ps->SetSRV("depthTex", tmpDepthTex->GetShaderResourceView(0, 0, 0, 0, false, RENDER_FORMAT_R24_UNORM_X8_TYPELESS)); ps->SetSRV("gbuffer0", gbuffer0->GetShaderResourceView()); ps->SetSRV("gbuffer1", gbuffer1->GetShaderResourceView()); ps->SetSampler("pointClampSampler", SamplerTemplate<FILTER_MIN_MAG_MIP_POINT>::Get()); ps->SetSampler("linearSampler", SamplerTemplate<>::Get()); ps->Flush(); auto rc = Global::GetRenderEngine()->GetRenderContext(); rc->SetDepthStencilState( DepthStencilStateTemplate< false, DEPTH_WRITE_ZERO, COMPARISON_LESS, true, 0xff, 0xff, STENCIL_OP_KEEP, STENCIL_OP_KEEP, STENCIL_OP_KEEP, COMPARISON_NOT_EQUAL>::Get(), 0); DrawQuad( { ssrResult->GetRenderTargetView(0, 0, 1) }, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, sceneClipDepth->GetDepthStencilView(0, 0, 1, RENDER_FORMAT_D24_UNORM_S8_UINT)); auto ssrSharedRef = SSRNeighborShare(view, ssrResult, gbuffer1, tmpDepthTex, sceneClipDepth); auto ssrShared = ssrSharedRef->Get()->Cast<Texture>(); // Temporal AA for SSR auto ssrAAedResultTexRef = TexturePool::Instance().FindFree({ TEXTURE_2D, sceneTex->GetDesc() }); auto ssrAAedResultTex = ssrAAedResultTexRef->Get()->Cast<Texture>(); { auto adaptedExposureScale = view->GetViewRenderContext()->GetSharedTexture("AdaptedExposureScale"); float2 offsets[5] = { float2(0.0f, 0.0f), float2(-1.0f, 0.0f), float2(1.0f, 0.0f), float2(0.0f, -1.0f), float2(0.0f, 1.0f), }; float filterWeights[5]; float weightsSum = 0.0f; for (int i = 0; i < 5; ++i) { float2 offset = offsets[i] - float2(0.5f, -0.5f) * view->temporalAAJitter; //filterWeights[i] = CatmullRom(offset.x()) * CatmullRom(offset.y()); offset.x() *= 1.0f + 0.0f * 0.5f; offset.y() *= 1.0f + 0.0f * 0.5f; filterWeights[i] = exp(-2.29f * (offset.x() * offset.x() + offset.y() * offset.y())); weightsSum += filterWeights[i]; } for (auto & i : filterWeights) i /= weightsSum; std::map<String, String> macros; macros["TAA_DYNAMIC"] = "0"; macros["TAA_HISTORY_BICUBIC"] = "0"; auto ps = Shader::FindOrCreate<TemporalAAPS>(macros); view->BindShaderParams(ps); ps->SetScalar("texSize", ssrResult->GetTexSize()); ps->SetScalar("neighborFilterWeights", filterWeights, (int)sizeof(float) * 5); ps->SetScalar("frameCount", (uint32_t)Global::GetInfo()->frameCount); ps->SetScalar("lerpFactor", 0.125f); //ps->SetSRV("linearDepth", sceneLinearClipDepth->GetShaderResourceView()); ps->SetSRV("sceneDepth", sceneClipDepth->GetShaderResourceView(0, 0, 0, 0, false, RENDER_FORMAT_R24_UNORM_X8_TYPELESS)); ps->SetSRV("sceneTex", ssrShared->GetShaderResourceView()); //ps->SetSRV("velocityTex", velocityTex->GetShaderResourceView()); //ps->SetSRV("adaptedExposureScale", adaptedExposureScale->GetShaderResourceView()); if (_preSSRResultRef) ps->SetSRV("historyTex", _preSSRResultRef->Get()->Cast<Texture>()->GetShaderResourceView()); else ps->SetSRV("historyTex", nullptr); ps->SetSampler("pointSampler", SamplerTemplate<FILTER_MIN_MAG_MIP_POINT>::Get()); ps->SetSampler("linearSampler", SamplerTemplate<>::Get()); ps->Flush(); DrawQuad( { ssrAAedResultTex->GetRenderTargetView(0, 0, 1) }, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, sceneClipDepth->GetDepthStencilView(0, 0, 1, RENDER_FORMAT_D24_UNORM_S8_UINT)); _preSSRResultRef = ssrResultTexRef; } /*rc->SetBlendState( BlendStateTemplate<false, false, true, BLEND_PARAM_ONE, BLEND_PARAM_ONE, BLEND_OP_ADD>::Get()); rc->SetDepthStencil(sceneClipDepth->GetDepthStencilView(0, 0, 1, RENDER_FORMAT_D24_UNORM_S8_UINT)); Transform( ssrAAedResultTex->GetShaderResourceView(), sceneTex->GetRenderTargetView(0, 0, 1), { COLOR_WRITE_R, COLOR_WRITE_G ,COLOR_WRITE_B ,COLOR_WRITE_A }, 0.0f, 0.0f, nullptr, sceneClipDepth->GetDepthStencilView(0, 0, 1, RENDER_FORMAT_D24_UNORM_S8_UINT));*/ rc->SetBlendState(nullptr); rc->SetDepthStencilState(nullptr); view->GetViewRenderContext()->SetSharedResource("SSR", ssrAAedResultTexRef); }