public void BindParticleVB(CPass pass) { if (SubStates == null || SubStates.Length == 0) { return; } if (pass != null && pass.GeometryMesh != null) {//这里在粒子Mesh创建Pass的时候调用 if (pass.AttachVBs == null) { if (HostActorMesh != null && HostActorMesh.SceneMesh != null)//MeshPrimitives { pass.AttachVBs = new CVertexArray(); if (TrailNode != null && IsTrail && pass.GeometryMesh != null) { pass.BindGeometry(TrailNode.GeomMesh, 0, 0); } else { pass.BindGeometry(HostActorMesh.SceneMesh.MeshPrimitives, 0, 0); } pass.AttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstPos, mPosVB); pass.AttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstScale, mScaleVB); pass.AttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstQuat, mRotateVB); pass.AttachVBs.BindVertexBuffer(EVertexSteamType.VST_F4_1, mColorVB); if (MaterialInstanceNode != null) { MaterialInstanceNode.SetMaterialInstanceValue(HostActorMesh.SceneMesh); } } } if (pass.AttachVBs == null) { return; } if (TrailNode != null && IsTrail && pass.GeometryMesh != null) { if (TrailNode.TrailDataControlData != null && TrailNode.TrailDataControlData.IsVaild()) { TrailNode.TrailDataControlData.BindBuffs(CEngine.Instance.RenderContext, TrailNode.GeomMesh); pass.AttachVBs.NumInstances = 1; } else { pass.AttachVBs.NumInstances = 0; } } else { pass.AttachVBs.NumInstances = (uint)ParticleNumber; } } }
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; }