Ejemplo n.º 1
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);
         }
     }
 }
Ejemplo n.º 2
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;
                //        }
                //    }
                //}
            }
        }
Ejemplo n.º 3
0
        public void DrawScene(CRenderContext rc, CCommandList cmd, Graphics.CGfxCamera Camera, Graphics.View.CGfxSceneView view)
        {
            if (EnableDraw == false)
            {
                return;
            }
            if (mNeedUpdateGpuBuffer)
            {
                mNeedUpdateGpuBuffer = false;
                UpdateGpuBuffer(rc, cmd, Camera);
            }

            var program = mPass.Effect.ShaderProgram;

            if (UseComputeShader == false)
            {
                UpdateIndexBufferCPU(cmd, Camera);
            }
            else
            {
                ComputeDispatch(rc, cmd, Camera);
            }

            if (UseVTF)
            {
                CTextureBindInfo tbInfo = new CTextureBindInfo();
                if (program.FindTextureBindInfo(null, "gVertexTexture", ref tbInfo))
                {
                    mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mVertexTextureView);
                }
                if (program.FindTextureBindInfo(null, "gInstanceDataTexture", ref tbInfo))
                {
                    mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mInstanceDataTextureView);
                }
                var spInfo = new CSamplerBindInfo();
                if (program.FindSamplerBindInfo(null, "Samp_gVertexTexture", ref spInfo))
                {
                    mPass.ShaderSamplerBinder.VSBindSampler(spInfo.VSBindPoint, mSamplerState);
                }
                if (program.FindSamplerBindInfo(null, "Samp_gInstanceDataTexture", ref spInfo))
                {
                    mPass.ShaderSamplerBinder.VSBindSampler(spInfo.VSBindPoint, mSamplerState);
                }
            }
            else
            {
                //CTextureBindInfo tbInfo = new CTextureBindInfo();
                //if(program.FindTextureBindInfo(null, "AllVertexArray", ref tbInfo))
                //{
                //    mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mAllVertexSRV);
                //}
                //if (program.FindTextureBindInfo(null, "MeshInstanceArray", ref tbInfo))
                //{
                //    mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mMeshInstanceSRV);
                //}
                mPass.ShaderResources.VSBindTexture(14, mAllVertexSRV);
                mPass.ShaderResources.VSBindTexture(13, mMeshInstanceSRV);
            }

            CConstantBufferDesc cbInfo = new CConstantBufferDesc();

            if (mCBMeshBatch != null && program.GetCBufferDesc(program.FindCBuffer("cbMeshBatch"), ref cbInfo))
            {
                mPass.BindCBufferVS(cbInfo.VSBindPoint, mCBMeshBatch);
            }
            mPass.ViewPort = Camera.SceneView.Viewport;

            mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_Camera, Camera.CBuffer);
            if (view != null)
            {
                mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_View, view.SceneViewCB);
            }

            //mPass.ViewPort = view.Viewport;

            if (UseComputeShader == false)
            {
                mPass.AttachIndexBuffer = mCpuDrawIndexBuffer;

                var dpDesc = new CDrawPrimitiveDesc();
                dpDesc.SetDefault();
                dpDesc.NumPrimitives = mDrawArgs.IndexCountPerInstance / 3;
                mPass.GeometryMesh.SetAtom(0, 0, ref dpDesc);
            }
            else
            {
                mPass.AttachIndexBuffer = mDrawIndexBuffer;
                mPass.SetIndirectDraw(bufferIndirectDrawArgs, 0);
            }

            cmd.PushPass(mPass);
        }