コード例 #1
0
        public bool Init(CRenderContext rc, bool autoFlush)
        {
            mSceneRenderLayer = new CGfxRenderLayer[(int)ERenderLayer.RL_Num];
            for (int i = 0; i < mSceneRenderLayer.Length; i++)
            {
                mSceneRenderLayer[i] = new CGfxRenderLayer();
            }

            var shaderProgram = CEngine.Instance.EffectManager.DefaultEffect.ShaderProgram;

            CEngine.Instance.EffectManager.DefaultEffect.PreUse((succsessed) =>
            {
                var cbIndex = CEngine.Instance.EffectManager.DefaultEffect.CacheData.CBID_Camera;
                mCBuffer    = rc.CreateConstantBuffer(shaderProgram, cbIndex);
                if (mCBuffer == null)
                {
#if DEBUG
                    System.Diagnostics.Debug.Assert(false);
#endif
                }

                //mCBuffer.AutoFlush = autoFlush;
                SDK_GfxCamera_BindConstBuffer(CoreObject, mCBuffer.CoreObject);
            });
            return(true);
        }
コード例 #2
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);
         }
     }
 }
コード例 #3
0
        public bool Init(CRenderContext rc, CSwapChain swapChain, CGfxSceneViewInfo ViewInfo)
        {
            _mViewInfo  = ViewInfo;
            mCoreObject = NewNativeObjectByName <NativePointer>($"{CEngine.NativeNS}::GfxSceneView");
            if (SDK_GfxSceneView_Init(mCoreObject, rc.CoreObject, ViewInfo.Width, ViewInfo.Height) == false)
            {
                return(false);
            }

            var shaderProgram = CEngine.Instance.EffectManager.DefaultEffect.ShaderProgram;

            mSceneViewCB = rc.CreateConstantBuffer(shaderProgram, CEngine.Instance.EffectManager.DefaultEffect.CacheData.CBID_View);
            if (mSceneViewCB == null)
            {
                return(false);
            }
            SDK_GfxSceneView_BindConstBuffer(CoreObject, mSceneViewCB.CoreObject);

            mViewport        = new CViewport();
            mViewport.Width  = ViewInfo.Width;
            mViewport.Height = ViewInfo.Height;
            SDK_GfxSceneView_SetViewport(CoreObject, mViewport.CoreObject);

            //code which is deprecated and will be delete someday;
            {
                DirLightSpecularIntensityId = mSceneViewCB.FindVar("mDirLightSpecularIntensity");
                DirLightingAmbientId        = mSceneViewCB.FindVar("mDirLightingAmbient");
                DirLightingDiffuseId        = mSceneViewCB.FindVar("mDirLightingDiffuse");
                DirLightingSpecularId       = mSceneViewCB.FindVar("mDirLightingSpecular");
                DirLightShadingSSSId        = mSceneViewCB.FindVar("mDirLightShadingSSS");
            }

            mIDDirLightColor_Intensity = mSceneViewCB.FindVar("gDirLightColor_Intensity");
            mIDDirLightDirection_Leak  = mSceneViewCB.FindVar("gDirLightDirection_Leak");

            mIDSkyLightColor     = mSceneViewCB.FindVar("mSkyLightColor");
            mID_GroundLightColor = mSceneViewCB.FindVar("mGroundLightColor");

            mIDViewportSizeAndRcp = mSceneViewCB.FindVar("gViewportSizeAndRcp");
            mIDEnvMapMipMaxLevel  = mSceneViewCB.FindVar("gEnvMapMaxMipLevel");

            mIDEyeEnvMapMipMaxLevel = mSceneViewCB.FindVar("gEyeEnvMapMaxMipLevel");

            mID_DepthBiasAndZFarRcp   = mSceneViewCB.FindVar("gDepthBiasAndZFarRcp");
            mID_FadeParam             = mSceneViewCB.FindVar("gFadeParam");
            mID_ShadowTransitionScale = mSceneViewCB.FindVar("gShadowTransitionScale");
            mID_ShadowMapSizeAndRcp   = mSceneViewCB.FindVar("gShadowMapSizeAndRcp");
            mID_Viewer2ShadowMtx      = mSceneViewCB.FindVar("gViewer2ShadowMtx");
            mID_ShadowDistance        = mSceneViewCB.FindVar("gShadowDistance");

            mID_ShadowTransitionScaleArrayEditor = mSceneViewCB.FindVar("gShadowTransitionScaleArrayEditor");
            mID_CsmNum = mSceneViewCB.FindVar("gCsmNum");
            mID_Viewer2ShadowMtxArrayEditor = mSceneViewCB.FindVar("gViewer2ShadowMtxArrayEditor");
            mID_CsmDistanceArray            = mSceneViewCB.FindVar("gCsmDistanceArray");

            mID_PointLightPos_RadiusInv   = mSceneViewCB.FindVar("PointLightPos_RadiusInv");
            mID_PointLightColor_Intensity = mSceneViewCB.FindVar("PointLightColor_Intensity");

            return(OnResize(rc, swapChain, ViewInfo.Width, ViewInfo.Height));
        }
コード例 #4
0
        public async System.Threading.Tasks.Task <bool> InitForMultiPassMode(CRenderContext RHICtx, CGfxScreenViewDesc ViewInfo, List <CGfxShadingEnv> ShadingEnvArray,
                                                                             CGfxMaterialInstance MtlInst, CGfxMesh ViewportMesh)
        {
            if (ShadingEnvArray == null)
            {
                return(false);
            }

            if (ViewportMesh == null)
            {
                var RectMesh = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(RHICtx, CEngineDesc.FullScreenRectName, true);
                ViewportMesh = CEngine.Instance.MeshManager.CreateMesh(RHICtx, RectMesh);
                ViewportMesh.SetMaterialInstance(RHICtx, 0, await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(RHICtx,
                                                                                                                                    RName.GetRName("Material/defaultmaterial.instmtl")),
                                                 CEngine.Instance.PrebuildPassData.DefaultShadingEnvs);
                //await ViewportMesh.AwaitEffects();
            }
            mViewInfo = ViewInfo;

            mViewport          = new CViewport();
            mViewport.Width    = ViewInfo.Width;
            mViewport.Height   = ViewInfo.Height;
            mViewport.TopLeftX = 0.0f;
            mViewport.TopLeftY = 0.0f;
            mViewport.MinDepth = 0.0f;
            mViewport.MaxDepth = 1.0f;

            var ShaderProgram = CEngine.Instance.EffectManager.DefaultEffect.ShaderProgram;

            mScreenViewCB = RHICtx.CreateConstantBuffer(ShaderProgram, CEngine.Instance.EffectManager.DefaultEffect.CacheData.CBID_View);
            if (mScreenViewCB == null)
            {
                return(false);
            }
            mIDViewportSizeAndRcp = mScreenViewCB.FindVar("gViewportSizeAndRcp");
            mID_SunPosNDC         = mScreenViewCB.FindVar("gSunPosNDC");
            mID_AoParam           = mScreenViewCB.FindVar("gAoParam");

            CRasterizerStateDesc RSDesc = new CRasterizerStateDesc();

            RSDesc.InitForCustom();
            mRasterState = CEngine.Instance.RasterizerStateManager.GetRasterizerState(RHICtx, RSDesc);

            CDepthStencilStateDesc DSSDesc = new CDepthStencilStateDesc();

            DSSDesc.InitForCustomLayers();
            mDepthStencilState = CEngine.Instance.DepthStencilStateManager.GetDepthStencilState(RHICtx, DSSDesc);

            CBlendStateDesc BlendDesc = new CBlendStateDesc();

            BlendDesc.InitForCustomLayers();
            mBlendState = CEngine.Instance.BlendStateManager.GetBlendState(RHICtx, BlendDesc);

            for (UInt32 idx = 0; idx < ShadingEnvArray.Count; idx++)
            {
                var refPass = RHICtx.CreatePass();
                if (false == await refPass.InitPassForViewportView(RHICtx, ShadingEnvArray[(int)idx], MtlInst, ViewportMesh))
                {
                    return(false);
                }
                mPassArray.Add(refPass);
            }

            return(OnResize(RHICtx, null, ViewInfo.Width, ViewInfo.Height));
        }
コード例 #5
0
        public async System.Threading.Tasks.Task <bool> Init(CRenderContext RHICtx, CSwapChain SwapChain,
                                                             CGfxScreenViewDesc ViewInfo, CGfxShadingEnv ShadingEnv, CGfxMaterialInstance MtlInst, CGfxMesh ViewportMesh)
        {
            if (ShadingEnv == null)
            {
                return(false);
            }
            if (ViewportMesh == null)
            {
                var ScreenAlignedTriangle = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(RHICtx, CEngineDesc.ScreenAlignedTriangleName, true);
                ViewportMesh = CEngine.Instance.MeshManager.CreateMesh(RHICtx, ScreenAlignedTriangle);
                ViewportMesh.SetMaterialInstance(RHICtx, 0, await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(RHICtx,
                                                                                                                                    RName.GetRName("Material/defaultmaterial.instmtl")),
                                                 CEngine.Instance.PrebuildPassData.DefaultShadingEnvs);
                //await ViewportMesh.AwaitEffects();
            }
            mViewInfo = ViewInfo;

            mViewport          = new CViewport();
            mViewport.Width    = ViewInfo.Width;
            mViewport.Height   = ViewInfo.Height;
            mViewport.TopLeftX = 0.0f;
            mViewport.TopLeftY = 0.0f;
            mViewport.MinDepth = 0.0f;
            mViewport.MaxDepth = 1.0f;

            var ShaderProgram = CEngine.Instance.EffectManager.DefaultEffect.ShaderProgram;

            mScreenViewCB = RHICtx.CreateConstantBuffer(ShaderProgram, CEngine.Instance.EffectManager.DefaultEffect.CacheData.CBID_View);
            if (mScreenViewCB == null)
            {
                return(false);
            }

            mIDViewportSizeAndRcp       = mScreenViewCB.FindVar("gViewportSizeAndRcp");
            mID_SunPosNDC               = mScreenViewCB.FindVar("gSunPosNDC");
            mID_DirLightColor_Intensity = mScreenViewCB.FindVar("gDirLightColor_Intensity");
            mID_AoParam = mScreenViewCB.FindVar("gAoParam");

            CRasterizerStateDesc RSDesc = new CRasterizerStateDesc();

            RSDesc.InitForCustom();
            mRasterState = CEngine.Instance.RasterizerStateManager.GetRasterizerState(RHICtx, RSDesc);

            CDepthStencilStateDesc DSSDesc = new CDepthStencilStateDesc();

            DSSDesc.InitForCustomLayers();
            mDepthStencilState = CEngine.Instance.DepthStencilStateManager.GetDepthStencilState(RHICtx, DSSDesc);

            CBlendStateDesc BlendDesc = new CBlendStateDesc();

            BlendDesc.InitForCustomLayers();
            mBlendState = CEngine.Instance.BlendStateManager.GetBlendState(RHICtx, BlendDesc);

            mPass = RHICtx.CreatePass();
            if (false == await mPass.InitPassForViewportView(RHICtx, ShadingEnv, MtlInst, ViewportMesh))
            {
                return(false);
            }

            return(OnResize(RHICtx, SwapChain, ViewInfo.Width, ViewInfo.Height));
        }
コード例 #6
0
        public void UpdateMaterialCBuffer(CRenderContext rc, bool createCBuffer)
        {
            var cbIndex = mEffect.ShaderProgram.FindCBuffer("cbPerInstance");

            if ((int)cbIndex >= 0)
            {
                if (createCBuffer || mCBuffer == null)
                {
                    mCBuffer?.Cleanup();
                    mCBuffer = rc.CreateConstantBuffer(mEffect.ShaderProgram, cbIndex);
                }
                else
                {
                    var cbDesc = new CConstantBufferDesc();
                    if (mEffect.ShaderProgram.GetCBufferDesc(cbIndex, ref cbDesc))
                    {
                        if (mCBuffer.Size != cbDesc.Size)
                        {
                            Profiler.Log.WriteLine(Profiler.ELogTag.Warning, "Material", $"{mEffect.Desc.Material.Name} CBuffer size is invalid, recreate it");
                            mCBuffer?.Cleanup();
                            mCBuffer = rc.CreateConstantBuffer(mEffect.ShaderProgram, cbIndex);
                        }
                    }
                }

                mWorldMatrixId = mCBuffer.FindVar("WorldMatrix");
                mWorldViewProjectionMatrixId = mCBuffer.FindVar("WorldViewProjectionMatrix");
                Material.SetCBufferVars(mCBuffer);
                //for (UInt32 i = 0; i < Material.VarNumber; i++)
                //{
                //    var name = Material.GetVarName(i, false);
                //    var varIdx = mCBuffer.FindVar(name);

                //    CGfxVar varDesc = new CGfxVar();
                //    Material.GetVarDesc(i, ref varDesc);
                //    ConstantVarDesc varDesc2 = new ConstantVarDesc();
                //    var ret = mCBuffer.GetVarDesc(varIdx, ref varDesc2);
                //    if (false == ret)
                //        continue;

                //    if (varDesc.Type != varDesc2.Type || varDesc.Elements != varDesc2.Elements)
                //    {
                //        Profiler.Log.WriteLine(Profiler.ELogTag.Warning, "ShaderVar", $"MaterialInstance Var {varDesc.Type} don't match CBuffer Var {varDesc2.Type}");
                //        continue;
                //    }

                //    for (UInt32 j = 0; j < varDesc.Elements; j++)
                //    {
                //        switch (varDesc.Type)
                //        {
                //            case EShaderVarType.SVT_Float1:
                //                {
                //                    float value = 0;
                //                    Material.GetVarValue(i, j, ref value);
                //                    mCBuffer.SetValue(varIdx, value, j);
                //                }
                //                break;
                //            case EShaderVarType.SVT_Float2:
                //                {
                //                    Vector2 value = new Vector2();
                //                    Material.GetVarValue(i, j, ref value);
                //                    mCBuffer.SetValue(varIdx, value, j);
                //                }
                //                break;
                //            case EShaderVarType.SVT_Float3:
                //                {
                //                    Vector3 value = new Vector3();
                //                    Material.GetVarValue(i, j, ref value);
                //                    mCBuffer.SetValue(varIdx, value, j);
                //                }
                //                break;
                //            case EShaderVarType.SVT_Float4:
                //                {
                //                    Vector4 value = new Vector4();
                //                    Material.GetVarValue(i, j, ref value);
                //                    mCBuffer.SetValue(varIdx, value, j);
                //                }
                //                break;
                //            case EShaderVarType.SVT_Matrix4x4:
                //                {
                //                    Matrix value = new Matrix();
                //                    Material.GetVarValue(i, j, ref value);
                //                    mCBuffer.SetValue(varIdx, value, j);
                //                }
                //                break;
                //            default:
                //                break;
                //        }
                //    }
                //}
            }
        }
コード例 #7
0
        public async System.Threading.Tasks.Task InitPass(CRenderContext rc, Graphics.CGfxMaterialInstance MtlInst = null, bool isSM3 = false)
        {
            if (rc == null)
            {
                rc = CEngine.Instance.RenderContext;
            }

            if (CRenderContext.ShaderModel >= 4)
            {
                UseComputeShader = true;
                Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Graphics", $"GpuDriven: SM = {CRenderContext.ShaderModel},Use ComputeShader");
            }
            else
            {
                UseComputeShader = false;
                Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Graphics", $"GpuDriven: SM = {CRenderContext.ShaderModel},CPU Culling");
            }

            if (rc.ContextCaps.MaxVertexShaderStorageBlocks == 0)
            {
                UseVTF = true;
                Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Graphics", $"GpuDriven: No SSBO in VertexShader,Use VTF");
            }
            else
            {
                UseVTF = false;
                Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Graphics", $"GpuDriven: Use SSBO in VertexShader");
            }
            if (mMergeInstanceSE == null)
            {
                mMergeInstanceSE = mMergeInstanceSE = EngineNS.CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMergeInstanceSE>();
                if (UseVTF)
                {
                    mMergeInstanceSE.SetMacroDefineValue("ENV_USEVTF", "1");
                }
                else
                {
                    mMergeInstanceSE.SetMacroDefineValue("ENV_USEVTF", "0");
                }
            }
            if (MtlInst == null)
            {
                MtlInst = await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(rc, RName.GetRName("Material/defaultmaterial.instmtl"));
            }
            if (mPass == null)
            {
                var pass = rc.CreatePass();

                var meshpri = CEngine.Instance.MeshPrimitivesManager.CreateMeshPrimitives(rc, 1);
                EngineNS.Graphics.Mesh.CGfxMeshCooker.MakeRect3D(rc, meshpri);
                //var meshpri = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(rc, CEngineDesc.ScreenAlignedTriangleName, true);
                var ViewportMesh = CEngine.Instance.MeshManager.CreateMesh(rc, meshpri);
                ViewportMesh.SetMaterialInstance(rc, 0, MtlInst,
                                                 CEngine.Instance.PrebuildPassData.DefaultShadingEnvs);

                var affectLights = new List <GamePlay.SceneGraph.GSceneGraph.AffectLight>();
                ViewportMesh.mMeshVars.SetPointLights(affectLights);

                await pass.InitPassForViewportView(rc, mMergeInstanceSE, MtlInst, ViewportMesh);

                mPass = pass;

                var vsDesc = mPass.Effect.ShaderProgram.VertexShader.Desc;

                var tbInfo = new CTextureBindInfo();
                if (vsDesc.GetSRVDesc(vsDesc.FindSRVDesc("AllVertexArray"), ref tbInfo))
                {
                }
                if (vsDesc.GetSRVDesc(vsDesc.FindSRVDesc("MeshInstanceArray"), ref tbInfo))
                {
                }
            }

            //const string CSVersion = "cs_5_0";
            var macros     = new CShaderDefinitions();
            var shaderFile = RName.GetRName("Shaders/Compute/GpuDriven/Cluster.compute", RName.enRNameType.Engine);

            mCS_MeshBatchDesc = rc.CreateShaderDesc(shaderFile, "CSMain_MeshBatch", EShaderType.EST_ComputeShader, macros, CIPlatform.Instance.PlatformType);
            mCS_MeshBatch     = rc.CreateComputeShader(mCS_MeshBatchDesc);

            mCS_ClearBatchArgsDesc = rc.CreateShaderDesc(shaderFile, "CSMain_ClearBatchArgs", EShaderType.EST_ComputeShader, macros, CIPlatform.Instance.PlatformType);
            mCS_ClearBatchArgs     = rc.CreateComputeShader(mCS_ClearBatchArgsDesc);

            var cbIndex = mCS_MeshBatchDesc.FindCBufferDesc("cbMeshBatch");

            if (cbIndex != uint.MaxValue)
            {
                mCBMeshBatch = rc.CreateConstantBuffer(mCS_MeshBatchDesc, cbIndex);
            }
        }