public async System.Threading.Tasks.Task <bool> InitPassForViewportView(CRenderContext RHICtx, Graphics.CGfxShadingEnv shadingEnv, Graphics.CGfxMaterialInstance MtlInst, Graphics.Mesh.CGfxMesh ViewportMesh) { var effect = GetEffect(RHICtx, shadingEnv.EnvCode, MtlInst, ViewportMesh); if (effect == null) { return(false); } await effect.AwaitLoad(); if (effect.ShaderProgram == null) { return(false); } this.ShadingEnv = shadingEnv; this.Effect = effect; this.mMtlInst = MtlInst; this.MtlMesh = ViewportMesh.MtlMeshArray[0]; if (mRenderPipeline == null) { var RplDesc = new CRenderPipelineDesc(); RenderPipeline = RHICtx.CreateRenderPipeline(RplDesc); } BindCBuffer(effect.ShaderProgram, effect.CacheData.PerInstanceId, ViewportMesh.MtlMeshArray[0].CBuffer); BindCBuffer(effect.ShaderProgram, effect.CacheData.PerFrameId, CEngine.Instance.PerFrameCBuffer); this.BindGeometry(ViewportMesh.MeshPrimitives, 0, 0); PreUse(); return(true); }
public void InitPass(CRenderContext RHICtx, Graphics.CGfxEffect effect, Graphics.CGfxShadingEnv shadingEnv, Graphics.Mesh.CGfxMtlMesh mesh, UInt32 index) { if (IsEffectValid == 2) { if (Effect != effect) { Effect = effect; if (Effect.CacheData.PerFrameId != UInt32.MaxValue) { BindCBuffer(Effect.ShaderProgram, Effect.CacheData.PerFrameId, CEngine.Instance.PerFrameCBuffer); } } } ShadingEnv = shadingEnv; Effect = effect; MtlMesh = mesh; MeshIndex = index; if (mRenderPipeline == null) { var RplDesc = new CRenderPipelineDesc(); RenderPipeline = RHICtx.CreateRenderPipeline(RplDesc); } this.BindGeometry(MtlMesh.mRootSceneMesh.MeshPrimitives, index, 0); }
public CRenderPipeline CreateRenderPipeline(CRenderPipelineDesc desc) { unsafe { var obj = SDK_IRenderContext_CreateRenderPipeline(CoreObject, &desc); if (obj.Pointer == IntPtr.Zero) { return(null); } return(new CRenderPipeline(obj)); } }
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); }