示例#1
0
 public void ReCreateCBuffer(CRenderContext rc, CGfxEffect effect, bool FlushVars)
 {
     if (effect.CacheData.PerInstanceId != UInt32.MaxValue)
     {
         bool recreateCB = false;
         if (mCBuffer != null)
         {
             var desc = new CConstantBufferDesc();
             effect.ShaderProgram.GetCBufferDesc(effect.CacheData.PerInstanceId, ref desc);
             if (mCBuffer.Size != desc.Size)
             {
                 recreateCB = true;
             }
             else
             {
                 recreateCB = !mCBuffer.IsSameVars(effect.ShaderProgram, effect.CacheData.PerInstanceId);
             }
         }
         else
         {
             recreateCB = true;
         }
         if (recreateCB)
         {
             mCBuffer = rc.CreateConstantBuffer(effect.ShaderProgram, effect.CacheData.PerInstanceId);
             MtlInst.SetCBufferVars(CBuffer);
         }
         else if (FlushVars)
         {
             MtlInst.SetCBufferVars(CBuffer);
         }
     }
 }
示例#2
0
        public bool Init(CRenderContext RHICtx, CGfxMesh SceneMesh, UInt32 index, CGfxMaterialInstance mtl_inst, CGfxShadingEnv[] EnvShaderArray, bool preUseEffect)
        {
            if (EnvShaderArray == null)
            {
                EnvShaderArray = CEngine.Instance.PrebuildPassData.DefaultShadingEnvs;
            }

            MtlInst        = mtl_inst;
            mRootSceneMesh = SceneMesh;
            mAtomIndex     = index;

            CGfxEffect[] effects = new CGfxEffect[EnvShaderArray.Length];
            for (int ppi = 0; ppi < (int)PrebuildPassIndex.PPI_Num; ppi++)
            {
                if (EnvShaderArray[ppi] == null)
                {
                    continue;
                }

                var effect = GetEffectAsync(RHICtx, SceneMesh, true, EnvShaderArray[ppi].EnvCode);
                effects[ppi] = effect;
            }

            return(InitByEffects(RHICtx, SceneMesh, index, mtl_inst, effects, EnvShaderArray, preUseEffect));
        }
示例#3
0
        private void UpdateMaterialCBuffer(CRenderContext rc, CGfxEffect effect)
        {
            var cbIndex = effect.CacheData.PerInstanceId;// effect.ShaderProgram.FindCBuffer("cbPerInstance");

            if ((int)cbIndex >= 0)
            {
                PassData2ConstBufferPerTick(null);

                MtlInst.SetCBufferVars(CBuffer);
            }
        }
示例#4
0
        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;
                }
            }
        }