Exemple #1
0
        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;
        }
Exemple #2
0
        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;
                }
            }
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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();
        }