protected override void RecordCommandsInternal(ref MyRenderableProxy_2 proxy, int instanceIndex, int sectionIndex) { MyRenderUtils.SetSrvs(RC, ref proxy.ObjectSrvs); Debug.Assert(proxy.ForwardShaders.MultiInstance.VS != null); MyRenderUtils.BindShaderBundle(RC, proxy.ForwardShaders.MultiInstance); SetProxyConstants(ref proxy); for (int i = 0; i < proxy.Submeshes.Length; i++) { var submesh = proxy.Submeshes[i]; var material = MyMaterials1.ProxyPool.Data[submesh.MaterialId.Index]; MyRenderUtils.MoveConstants(RC, ref material.MaterialConstants); MyRenderUtils.SetConstants(RC, ref material.MaterialConstants, MyCommon.MATERIAL_SLOT); MyRenderUtils.SetSrvs(RC, ref material.MaterialSrvs); if (proxy.InstanceCount == 0) { switch (submesh.DrawCommand) { case MyDrawCommandEnum.DrawIndexed: RC.DrawIndexed(submesh.Count, submesh.Start, submesh.BaseVertex); break; case MyDrawCommandEnum.Draw: RC.Draw(submesh.Count, submesh.Start); break; default: break; } } else { switch (submesh.DrawCommand) { case MyDrawCommandEnum.DrawIndexed: //MyRender11.AddDebugQueueMessage("ForwardPass DrawIndexedInstanced " + proxy.VertexData.VB[0].DebugName); RC.DrawIndexedInstanced(submesh.Count, proxy.InstanceCount, submesh.Start, submesh.BaseVertex, proxy.StartInstance); break; case MyDrawCommandEnum.Draw: RC.DrawInstanced(submesh.Count, proxy.InstanceCount, submesh.Start, proxy.StartInstance); break; default: break; } } } }
protected override void RecordCommandsInternal(ref MyRenderableProxy_2 proxy, int instanceIndex, int sectionIndex) { MyRenderUtils.SetSrvs(RC, ref proxy.ObjectSrvs); Debug.Assert(proxy.DepthShaders.MultiInstance.VS != null); RC.SetRasterizerState(DefaultRasterizer); MyRenderUtils.BindShaderBundle(RC, proxy.DepthShaders.MultiInstance); SetProxyConstants(ref proxy); for (int i = 0; i < proxy.SubmeshesDepthOnly.Length; i++) { var submesh = proxy.SubmeshesDepthOnly[i]; if (proxy.InstanceCount == 0) { switch (submesh.DrawCommand) { case MyDrawCommandEnum.DrawIndexed: RC.DrawIndexed(submesh.Count, submesh.Start, submesh.BaseVertex); break; case MyDrawCommandEnum.Draw: RC.Draw(submesh.Count, submesh.Start); break; default: break; } } else { switch (submesh.DrawCommand) { case MyDrawCommandEnum.DrawIndexed: //MyRender11.AddDebugQueueMessage("DepthPass DrawIndexedInstanced " + proxy.VertexData.VB[0].DebugName); RC.DrawIndexedInstanced(submesh.Count, proxy.InstanceCount, submesh.Start, submesh.BaseVertex, proxy.StartInstance); break; case MyDrawCommandEnum.Draw: RC.DrawInstanced(submesh.Count, proxy.InstanceCount, submesh.Start, proxy.StartInstance); break; default: break; } } } }
private void DrawSubmesh(ref MyRenderableProxy_2 proxy, ref MyDrawSubmesh_2 submesh, int instanceIndex) { var material = MyMaterials1.ProxyPool.Data[submesh.MaterialId.Index]; MyRenderUtils.MoveConstants(RC, ref material.MaterialConstants); MyRenderUtils.SetConstants(RC, ref material.MaterialConstants, MyCommon.MATERIAL_SLOT); MyRenderUtils.SetSrvs(RC, ref material.MaterialSrvs); MyMergeInstancingConstants constants = new MyMergeInstancingConstants(); constants.InstanceIndex = instanceIndex; constants.StartIndex = submesh.Start; SetProxyConstants(ref proxy, constants); if (proxy.InstanceCount == 0) { switch (submesh.DrawCommand) { case MyDrawCommandEnum.DrawIndexed: RC.DrawIndexed(submesh.Count, submesh.Start, submesh.BaseVertex); break; case MyDrawCommandEnum.Draw: RC.Draw(submesh.Count, submesh.Start); break; default: break; } } else { switch (submesh.DrawCommand) { case MyDrawCommandEnum.DrawIndexed: RC.DrawIndexedInstanced(submesh.Count, proxy.InstanceCount, submesh.Start, submesh.BaseVertex, proxy.StartInstance); break; case MyDrawCommandEnum.Draw: RC.DrawInstanced(submesh.Count, proxy.InstanceCount, submesh.Start, proxy.StartInstance); break; default: break; } } Stats.Submeshes++; }
// viewport, render target internal unsafe static void Draw(IRtvBindable rtv, MyViewport viewport, IBlendState blendstate = null) { if (StackTop.m_internalBatch.Texture != null && StackTop.m_internalBatch.Count > 0) { StackTop.m_internalBatch.Commit(); } StackTop.m_internalBatch = new MySpritesBatch(); RC.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); RC.SetInputLayout(m_inputLayout); //RC.SetScreenViewport(); RC.SetViewport(viewport.OffsetX, viewport.OffsetY, viewport.Width, viewport.Height); RC.VertexShader.Set(m_vs); RC.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); RC.AllShaderStages.SetConstantBuffer(MyCommon.PROJECTION_SLOT, MyCommon.GetObjectCB(64)); RC.PixelShader.Set(m_ps); RC.PixelShader.SetSamplers(0, MySamplerStateManager.StandardSamplers); //RC.BindDepthRT(null, DepthStencilAccess.DepthReadOnly, MyRender11.Backbuffer); // to reset state RC.SetRtv(rtv); RC.SetBlendState(blendstate == null ? MyBlendStateManager.BlendAlphaPremult : blendstate); RC.SetDepthStencilState(MyDepthStencilStateManager.IgnoreDepthStencil, 0); CheckBufferSize(StackTop.m_instances.Count); RC.SetVertexBuffer(0, m_VB); var mapping = MyMapping.MapDiscard(m_VB); for (int i = 0; i < StackTop.m_instances.Count; i++) { var helper = StackTop.m_instances[i]; mapping.WriteAndPosition(ref helper); } mapping.Unmap(); mapping = MyMapping.MapDiscard(MyCommon.GetObjectCB(64)); var viewportSize = new Vector2(viewport.Width, viewport.Height); mapping.WriteAndPosition(ref viewportSize); mapping.Unmap(); foreach (var batch in StackTop.m_batches) { if (batch.ScissorRectangle.HasValue) { RC.SetRasterizerState(MyRasterizerStateManager.ScissorTestRasterizerState); var scissor = batch.ScissorRectangle.Value; RC.SetScissorRectangle((int)scissor.X, (int)scissor.Y, (int)(scissor.X + scissor.Width), (int)(scissor.Y + scissor.Height)); } else { RC.SetRasterizerState(MyRasterizerStateManager.NocullRasterizerState); } RC.PixelShader.SetSrv(0, batch.Texture); RC.DrawInstanced(4, batch.Count, 0, batch.Start); } RC.SetBlendState(null); RC.SetRasterizerState(null); RC.SetPrimitiveTopology(PrimitiveTopology.TriangleList); StackTop.m_instances.Clear(); StackTop.m_batches.Clear(); }
protected override void RecordCommandsInternal(ref MyRenderableProxy_2 proxy, int instanceIndex, int sectionIndex) { MyRenderUtils.SetSrvs(RC, ref proxy.ObjectSrvs); Debug.Assert(proxy.Shaders.MultiInstance.VS != null); MyRenderUtils.BindShaderBundle(RC, proxy.Shaders.MultiInstance); SetDepthStencilView(false); SetProxyConstants(ref proxy); for (int i = 0; i < proxy.Submeshes.Length; i++) { var submesh = proxy.Submeshes[i]; var material = MyMaterials1.ProxyPool.Data[submesh.MaterialId.Index]; MyRenderUtils.MoveConstants(RC, ref material.MaterialConstants); MyRenderUtils.SetConstants(RC, ref material.MaterialConstants, MyCommon.MATERIAL_SLOT); MyRenderUtils.SetSrvs(RC, ref material.MaterialSrvs); if (proxy.InstanceCount == 0) { switch (submesh.DrawCommand) { case MyDrawCommandEnum.DrawIndexed: if (!MyStereoRender.Enable) { RC.DrawIndexed(submesh.Count, submesh.Start, submesh.BaseVertex); } else { MyStereoRender.DrawIndexedGBufferPass(RC, submesh.Count, submesh.Start, submesh.BaseVertex); } break; case MyDrawCommandEnum.Draw: if (!MyStereoRender.Enable) { RC.Draw(submesh.Count, submesh.Start); } else { MyStereoRender.DrawGBufferPass(RC, submesh.Count, submesh.Start); } break; default: break; } } else { switch (submesh.DrawCommand) { case MyDrawCommandEnum.DrawIndexed: if (!MyStereoRender.Enable) { RC.DrawIndexedInstanced(submesh.Count, proxy.InstanceCount, submesh.Start, submesh.BaseVertex, proxy.StartInstance); } else { MyStereoRender.DrawIndexedInstancedGBufferPass(RC, submesh.Count, proxy.InstanceCount, submesh.Start, submesh.BaseVertex, proxy.StartInstance); } break; case MyDrawCommandEnum.Draw: if (!MyStereoRender.Enable) { RC.DrawInstanced(submesh.Count, proxy.InstanceCount, submesh.Start, proxy.StartInstance); } else { MyStereoRender.DrawInstancedGBufferPass(RC, submesh.Count, proxy.InstanceCount, submesh.Start, proxy.StartInstance); } break; default: break; } } } }