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