Ejemplo n.º 1
0
        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;
                }
            }
        }
Ejemplo n.º 2
0
        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;
        }