public void CookViewportMeshToPass(CRenderContext RHICtx, CGfxShadingEnv ShaderEnv, CGfxCamera Camera, CGfxMesh ViewportMesh) { if (ViewportMesh == null) { Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"ViewportViewError!!!", ""); System.Diagnostics.Debug.Assert(false); return; } if (mPass == null) { System.Diagnostics.Debug.Assert(false); return; } ViewportMesh.MeshPrimitives.PreUse(false); var refMtlMesh = ViewportMesh.MtlMeshArray[0]; if (refMtlMesh == null) { return; } mPass.RenderPipeline.RasterizerState = mRasterState; mPass.RenderPipeline.DepthStencilState = mDepthStencilState; mPass.RenderPipeline.BlendState = mBlendState; mPass.BindShaderTextures(refMtlMesh); //if(mPass.ShaderSamplerBinder==null) //{ // mPass.ShaderSamplerBinder = new CShaderSamplers(); //} //refMtlMesh.GetSamplerBinder(RHICtx, mPass.Effect.ShaderProgram, mPass.ShaderSamplerBinder); //var tempSampler = new CShaderSamplers(); var tempSampler = mCookVPMeshSampler; refMtlMesh.GetSamplerBinder(RHICtx, mPass.Effect.ShaderProgram, tempSampler); mPass.ShaderSamplerBinder = tempSampler; ShaderEnv.BindResources(ViewportMesh, mPass); mPass.BindGeometry(ViewportMesh.MeshPrimitives, 0, 0); mPass.ViewPort = mViewport; mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_Camera, Camera.CBuffer); mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_View, mScreenViewCB); mPass.OnCookRenderData(ShaderEnv, PrebuildPassIndex.PPI_Default); return; }
public void CookShadowLayerData2Pass(CRenderContext RHICtx, CGfxCamera ViewerCamera, CGfxCamera ShadowCamera, CGfxShadingEnv ShadingEnv) { if (ViewerCamera == null || ShadowCamera == null || RHICtx == null || ShadingEnv == null) { return; } var ShadowRenderLayer = ViewerCamera.mSceneRenderLayer[(int)ERenderLayer.RL_Shadow]; int Count = ShadowRenderLayer.GetRenderLayerAtomNum(); for (uint idx = 0; idx < Count; idx++) { var MtlMesh = ShadowRenderLayer.GetMtlMeshFromArray(idx); if (MtlMesh == null) { return; } var SceneMesh = MtlMesh.mRootSceneMesh; if (MtlMesh == null || SceneMesh == null) { Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"NullPtr here", ""); continue; } MtlMesh.UpdatePerMtlMeshCBufferForShadow(RHICtx, ShadowCamera); CPass refPass = MtlMesh.GetPass(PrebuildPassIndex.PPI_SSM); if (refPass == null) { continue; } if (refPass.PreUse() == false) { continue; } refPass.BindShaderTextures(MtlMesh); refPass.ShaderSamplerBinder = MtlMesh.GetSamplerBinder_Shadow(RHICtx, refPass.Effect.ShaderProgram); ShadingEnv.BindResources(SceneMesh, refPass); refPass.ViewPort = mViewport; refPass.BindCBuffer(refPass.Effect.ShaderProgram, refPass.Effect.CacheData.CBID_Camera, ShadowCamera.CBuffer); refPass.BindCBuffer(refPass.Effect.ShaderProgram, refPass.Effect.CacheData.CBID_View, SceneViewCB); SceneMesh.MdfQueue.OnSetPassData(refPass, true); SendPassToCorrectRenderLayer(ERenderLayer.RL_Shadow, refPass); } }
public override void BindResources(Graphics.Mesh.CGfxMesh mesh, CPass pass) { var fmesh = mesh.Tag as CFontMesh; if (fmesh != null) { if (fmesh.CBuffer == null) { fmesh.CBuffer = CEngine.Instance.RenderContext.CreateConstantBuffer(pass.Effect.ShaderProgram, pass.Effect.CacheData.CBID_ShadingEnv); int TextMatrixId = fmesh.CBuffer.FindVar("RenderMatrix"); int TextOpacityId = fmesh.CBuffer.FindVar("TextOpacity"); int TextColorId = fmesh.CBuffer.FindVar("TextColor"); fmesh.CBuffer.SetValue(TextMatrixId, fmesh.RenderMatrix, 0); fmesh.CBuffer.SetValue(TextOpacityId, fmesh.TextOpacity, 0); fmesh.CBuffer.SetValue(TextColorId, fmesh.TextColor, 0); } pass.BindCBuffer(pass.GpuProgram, pass.Effect.CacheData.CBID_ShadingEnv, fmesh.CBuffer); } }
public void FillPassData(CRenderContext RHICtx, CPass refPass, CGfxEffect effect, PrebuildPassIndex ppi, bool flushVars = false) { refPass.Effect = effect; if (effect.CacheData.PerInstanceId != UInt32.MaxValue) { ReCreateCBuffer(RHICtx, effect, flushVars); } refPass.BindCBuffer(effect.ShaderProgram, effect.CacheData.PerInstanceId, CBuffer); MtlInst.BindTextures(refPass.ShaderResources, effect.ShaderProgram); refPass.BindShaderTextures(this); var tempSampler = new CShaderSamplers(); this.GetSamplerBinder(RHICtx, effect.ShaderProgram, tempSampler); refPass.ShaderSamplerBinder = tempSampler; var PrebuildPassData = CEngine.Instance.PrebuildPassData; if (ppi == PrebuildPassIndex.PPI_HitProxy || ppi == PrebuildPassIndex.PPI_SceneCapture) { switch (MtlInst.mRenderLayer) { case View.ERenderLayer.RL_Opaque: { refPass.RenderPipeline.RasterizerState = PrebuildPassData.mOpaqueRasterStat; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mOpaqueBlendStat; } break; case View.ERenderLayer.RL_Translucent: { refPass.RenderPipeline.RasterizerState = PrebuildPassData.mTranslucentRasterStat; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mTranslucentDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mOpaqueBlendStat; } break; case View.ERenderLayer.RL_CustomOpaque: case View.ERenderLayer.RL_CustomTranslucent: case View.ERenderLayer.RL_Gizmos: case View.ERenderLayer.RL_Sky: { refPass.RenderPipeline.RasterizerState = MtlInst.CustomRasterizerState; refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState; refPass.RenderPipeline.BlendState = PrebuildPassData.mOpaqueBlendStat; } break; } } else if (ppi == PrebuildPassIndex.PPI_Snapshot) { switch (MtlInst.mRenderLayer) { case View.ERenderLayer.RL_Opaque: { refPass.RenderPipeline.RasterizerState = PrebuildPassData.mOpaqueRasterStat; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mOpaqueBlendStat; } break; case View.ERenderLayer.RL_Translucent: { refPass.RenderPipeline.RasterizerState = PrebuildPassData.mTranslucentRasterStat; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mTranslucentDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mSnapshotBlendStat; } break; case View.ERenderLayer.RL_CustomOpaque: case View.ERenderLayer.RL_CustomTranslucent: case View.ERenderLayer.RL_Gizmos: case View.ERenderLayer.RL_Sky: { refPass.RenderPipeline.RasterizerState = MtlInst.CustomRasterizerState; refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState; refPass.RenderPipeline.BlendState = PrebuildPassData.mSnapshotBlendStat; } break; } } else if (ppi == PrebuildPassIndex.PPI_PickedEditor) { switch (MtlInst.mRenderLayer) { case View.ERenderLayer.RL_Opaque: { refPass.RenderPipeline.RasterizerState = PrebuildPassData.mOpaqueRasterStat; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mOpaqueBlendStat; } break; case View.ERenderLayer.RL_Translucent: { refPass.RenderPipeline.RasterizerState = PrebuildPassData.mTranslucentRasterStat; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mTranslucentDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mOpaqueBlendStat; } break; case View.ERenderLayer.RL_CustomOpaque: case View.ERenderLayer.RL_CustomTranslucent: case View.ERenderLayer.RL_Gizmos: case View.ERenderLayer.RL_Sky: { refPass.RenderPipeline.RasterizerState = MtlInst.CustomRasterizerState; refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState; refPass.RenderPipeline.BlendState = PrebuildPassData.mOpaqueBlendStat; } break; } } else if (ppi == PrebuildPassIndex.PPI_SSM) { refPass.RenderPipeline.RasterizerState = MtlInst.mShadowRasterState; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mShadowBlendStat; } else { switch (MtlInst.mRenderLayer) { case View.ERenderLayer.RL_Shadow: { refPass.RenderPipeline.RasterizerState = MtlInst.mShadowRasterState; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mShadowBlendStat; } break; case View.ERenderLayer.RL_Opaque: { refPass.RenderPipeline.RasterizerState = PrebuildPassData.mOpaqueRasterStat; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mOpaqueBlendStat; } break; case View.ERenderLayer.RL_Translucent: { refPass.RenderPipeline.RasterizerState = PrebuildPassData.mTranslucentRasterStat; refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mTranslucentDSStat; refPass.RenderPipeline.BlendState = PrebuildPassData.mTranslucentBlendStat; } break; case View.ERenderLayer.RL_CustomOpaque: case View.ERenderLayer.RL_CustomTranslucent: { refPass.RenderPipeline.RasterizerState = MtlInst.CustomRasterizerState; refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState; refPass.RenderPipeline.BlendState = MtlInst.CustomBlendState; // PrebuildPassData.mOpaqueBlendStat; } break; case View.ERenderLayer.RL_Gizmos: case View.ERenderLayer.RL_Sky: { refPass.RenderPipeline.RasterizerState = MtlInst.CustomRasterizerState; refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState; refPass.RenderPipeline.BlendState = MtlInst.CustomBlendState; } break; } } }
public void SetPassData(CRenderContext rc, CGfxMesh mesh, UInt32 index, CGfxSceneView vp, CPass pass) { //OnEffectRefresh(rc); if (pass.RenderPipeline == null) { var rplDesc = new CRenderPipelineDesc(); pass.RenderPipeline = rc.CreateRenderPipeline(rplDesc); } pass.RenderPipeline.ShaderProgram = mEffect.ShaderProgram; pass.RenderPipeline.RasterizerState = mMaterial.RasterizerState; pass.RenderPipeline.DepthStencilState = mMaterial.DepthStencilState; pass.RenderPipeline.BlendState = mMaterial.BlendState; pass.GeometryMesh = mesh.MeshPrimitives.GeometryMesh; pass.BindCBuffer(mEffect.ShaderProgram, mEffect.PerInstanceId, CBuffer); pass.BindCBuffer(mEffect.ShaderProgram, mEffect.PerFrameId, CEngine.Instance.PerFrameCBuffer); if (vp != null) { pass.ViewPort = vp.Viewport; } var textures = new CShaderResources(); { Material.BindTextures(textures, mEffect.ShaderProgram); foreach (var i in Textures) { textures.PSBindTexture(i.Key, i.Value); } mesh.ShadingEnv.BindResources(mesh, CBuffer, textures, mEffect.ShaderProgram); } pass.ShaderResources = textures; CShaderSamplers samplers = new CShaderSamplers(); { CSamplerStateDesc sampDesc = new CSamplerStateDesc(); sampDesc.SetDefault(); sampDesc.Filter = ESamplerFilter.SPF_MIN_MAG_MIP_POINT; CSamplerState samp = CEngine.Instance.SamplerStateManager.GetSamplerState(rc, sampDesc); for (UInt32 i = 0; i < mEffect.ShaderProgram.SamplerNumber; i++) { CSamplerBindInfo info = new CSamplerBindInfo(); mEffect.ShaderProgram.GetSamplerBindInfo(i, ref info); samplers.PSBindSampler(info.PSBindPoint, samp); } } pass.ShaderSamplers = samplers; foreach (var i in mesh.MdfQueue.Modifiers) { i.OnSetPassData(pass); } CDrawPrimitiveDesc dpDesc = new CDrawPrimitiveDesc(); mesh.MeshPrimitives.GetAtom(index, 0, ref dpDesc); pass.BindDrawPrimitive(ref dpDesc); }
public void DrawScene(CRenderContext rc, CCommandList cmd, Graphics.CGfxCamera Camera, Graphics.View.CGfxSceneView view) { if (EnableDraw == false) { return; } if (mNeedUpdateGpuBuffer) { mNeedUpdateGpuBuffer = false; UpdateGpuBuffer(rc, cmd, Camera); } var program = mPass.Effect.ShaderProgram; if (UseComputeShader == false) { UpdateIndexBufferCPU(cmd, Camera); } else { ComputeDispatch(rc, cmd, Camera); } if (UseVTF) { CTextureBindInfo tbInfo = new CTextureBindInfo(); if (program.FindTextureBindInfo(null, "gVertexTexture", ref tbInfo)) { mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mVertexTextureView); } if (program.FindTextureBindInfo(null, "gInstanceDataTexture", ref tbInfo)) { mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mInstanceDataTextureView); } var spInfo = new CSamplerBindInfo(); if (program.FindSamplerBindInfo(null, "Samp_gVertexTexture", ref spInfo)) { mPass.ShaderSamplerBinder.VSBindSampler(spInfo.VSBindPoint, mSamplerState); } if (program.FindSamplerBindInfo(null, "Samp_gInstanceDataTexture", ref spInfo)) { mPass.ShaderSamplerBinder.VSBindSampler(spInfo.VSBindPoint, mSamplerState); } } else { //CTextureBindInfo tbInfo = new CTextureBindInfo(); //if(program.FindTextureBindInfo(null, "AllVertexArray", ref tbInfo)) //{ // mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mAllVertexSRV); //} //if (program.FindTextureBindInfo(null, "MeshInstanceArray", ref tbInfo)) //{ // mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mMeshInstanceSRV); //} mPass.ShaderResources.VSBindTexture(14, mAllVertexSRV); mPass.ShaderResources.VSBindTexture(13, mMeshInstanceSRV); } CConstantBufferDesc cbInfo = new CConstantBufferDesc(); if (mCBMeshBatch != null && program.GetCBufferDesc(program.FindCBuffer("cbMeshBatch"), ref cbInfo)) { mPass.BindCBufferVS(cbInfo.VSBindPoint, mCBMeshBatch); } mPass.ViewPort = Camera.SceneView.Viewport; mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_Camera, Camera.CBuffer); if (view != null) { mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_View, view.SceneViewCB); } //mPass.ViewPort = view.Viewport; if (UseComputeShader == false) { mPass.AttachIndexBuffer = mCpuDrawIndexBuffer; var dpDesc = new CDrawPrimitiveDesc(); dpDesc.SetDefault(); dpDesc.NumPrimitives = mDrawArgs.IndexCountPerInstance / 3; mPass.GeometryMesh.SetAtom(0, 0, ref dpDesc); } else { mPass.AttachIndexBuffer = mDrawIndexBuffer; mPass.SetIndirectDraw(bufferIndirectDrawArgs, 0); } cmd.PushPass(mPass); }
public void CookSpecRenderLayerDataToPass(CRenderContext RHICtx, ERenderLayer RenderLayer, CGfxCamera ViewerCamera, CGfxShadingEnv ShadingEnv, PrebuildPassIndex ppi) { ScopeCook2Pass.Begin(); if (ViewerCamera == null || RenderLayer == ERenderLayer.RL_Shadow) { return; } if (RenderLayer == ERenderLayer.RL_Num) { RenderLayer = ERenderLayer.RL_Num - 1; return; } var SpecRenderLayer = ViewerCamera.mSceneRenderLayer[(int)RenderLayer]; int Count = SpecRenderLayer.GetRenderLayerAtomNum(); for (uint idx = 0; idx < Count; idx++) { var MtlMesh = SpecRenderLayer.GetMtlMeshFromArray(idx); if (MtlMesh == null) { break; } var SceneMesh = MtlMesh.mRootSceneMesh; if (MtlMesh == null || SceneMesh == null) { Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"NullPtr here", ""); continue; } if (ppi == PrebuildPassIndex.PPI_HitProxy && SceneMesh.mMeshVars.mHitProxyId == 0) { continue; } if (ppi == PrebuildPassIndex.PPI_PickedEditor) { if (SceneMesh.mSelected == false) { continue; } } MtlMesh.UpdatePerMtlMeshCBuffer(RHICtx, ViewerCamera); CPass refPass = MtlMesh.GetPass(ppi); if (refPass == null) { continue; } if (false == refPass.PreUse()) { continue; } refPass.OnCookRenderData(ShadingEnv, ppi); switch (ppi) { case PrebuildPassIndex.PPI_PickedEditor: refPass.BindShaderTextures(MtlMesh); refPass.ShaderSamplerBinder = MtlMesh.GetSamplerBinder_PickedEditor(RHICtx, refPass.Effect.ShaderProgram); ShadingEnv.BindResources(SceneMesh, refPass); break; case PrebuildPassIndex.PPI_HitProxy: { refPass.BindShaderTextures(MtlMesh); refPass.ShaderSamplerBinder = MtlMesh.GetSamplerBinder_HitProxy(RHICtx, refPass.Effect.ShaderProgram); ShadingEnv.BindResources(SceneMesh, refPass); } break; case PrebuildPassIndex.PPI_SceneCapture: case PrebuildPassIndex.PPI_OpaquePbr: case PrebuildPassIndex.PPI_TransparentPbr: case PrebuildPassIndex.PPI_CustomTranslucentPbr: case PrebuildPassIndex.PPI_OpaquePbrEditor: case PrebuildPassIndex.PPI_CustomTranslucentPbrEditor: case PrebuildPassIndex.PPI_Gizmos: case PrebuildPassIndex.PPI_Snapshot: case PrebuildPassIndex.PPI_Sky: { refPass.BindShaderTextures(MtlMesh); //refPass.ShaderSamplerBinder = MtlMesh.GetSamplerBinder(RHICtx, refPass.Effect.ShaderProgram); ShadingEnv.BindResources(SceneMesh, refPass); //var sEnv = refPass.Effect.Desc.EnvShaderPatch; //sEnv.BindResources(SceneMesh, refPass); } break; default: break; } refPass.ViewPort = Viewport; #if DEBUG if (ViewerCamera.CBuffer == null) { System.Diagnostics.Debug.Assert(false); } #endif refPass.BindCBuffer(refPass.Effect.ShaderProgram, refPass.Effect.CacheData.CBID_Camera, ViewerCamera.CBuffer); refPass.BindCBuffer(refPass.Effect.ShaderProgram, refPass.Effect.CacheData.CBID_View, SceneViewCB); SceneMesh.MdfQueue.OnSetPassData(refPass, false); SendPassToCorrectRenderLayer(RenderLayer, refPass); } ScopeCook2Pass.End(); }