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); }
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); } } }
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)); }
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)); }
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)); }
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; // } // } //} } }
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); } }