/// <summary>Bind blend states for alpha blending</summary> public static void BindMaterialTextureBlendStates(MyRenderContext rc, MyFileTextureEnum textures) { textures &= ~MyFileTextureEnum.ALPHAMASK; switch (textures) { case MyFileTextureEnum.COLOR_METAL: rc.SetBlendState(MyBlendStateManager.BlendDecalNormal); break; case MyFileTextureEnum.NORMALMAP_GLOSS: rc.SetBlendState(MyBlendStateManager.BlendDecalColor); break; case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS: rc.SetBlendState(MyBlendStateManager.BlendDecalNormalColor); break; case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS | MyFileTextureEnum.EXTENSIONS: rc.SetBlendState(MyBlendStateManager.BlendDecalNormalColorExt); break; default: throw new Exception("Unknown texture bundle type"); } }
internal static unsafe void FillBuffers(MyRenderableProxy proxy, MyRenderContext rc) { MyMapping mapping; mapping = MyMapping.MapDiscard(rc, proxy.ObjectBuffer); if (proxy.NonVoxelObjectData.IsValid) { mapping.WriteAndPosition(ref proxy.NonVoxelObjectData); } else if (proxy.VoxelCommonObjectData.IsValid) { mapping.WriteAndPosition(ref proxy.VoxelCommonObjectData); } mapping.WriteAndPosition(ref proxy.CommonObjectData); if (proxy.SkinningMatrices != null) { if (proxy.DrawSubmesh.BonesMapping == null) { mapping.WriteAndPosition(proxy.SkinningMatrices, Math.Min(MyRender11Constants.SHADER_MAX_BONES, proxy.SkinningMatrices.Length)); } else { for (int j = 0; j < proxy.DrawSubmesh.BonesMapping.Length; j++) { mapping.WriteAndPosition(ref proxy.SkinningMatrices[proxy.DrawSubmesh.BonesMapping[j]]); } } } mapping.Unmap(); }
static unsafe IConstantBuffer GetObjectCB(MyRenderContext RC, MyInstanceComponent instance, float stateData) { Vector4 col0, col1, col2; instance.GetMatrixCols(0, out col0, out col1, out col2); Matrix matrix = Matrix.Identity; matrix.SetRow(0, col0); matrix.SetRow(1, col1); matrix.SetRow(2, col2); matrix = Matrix.Transpose(matrix); int cbSize = sizeof(MyObjectDataCommon); cbSize += sizeof(MyObjectDataNonVoxel); IConstantBuffer cb = MyCommon.GetObjectCB(cbSize); var mapping = MyMapping.MapDiscard(RC, cb); MyObjectDataNonVoxel nonVoxelData = new MyObjectDataNonVoxel(); mapping.WriteAndPosition(ref nonVoxelData); MyObjectDataCommon commonData = new MyObjectDataCommon(); commonData.LocalMatrix = matrix; commonData.ColorMul = Vector3.One; commonData.KeyColor = new Vector3(0, -1f, 0f); commonData.CustomAlpha = stateData; mapping.WriteAndPosition(ref commonData); mapping.Unmap(); return(cb); }
internal static void DrawInstancedGBufferPass(MyRenderContext rc, int vertexCountPerInstance, int instanceCount, int startVertexLocation, int startInstanceLocation) { BeginDrawGBufferPass(rc); rc.DrawInstanced(vertexCountPerInstance, instanceCount, startVertexLocation, startInstanceLocation); SwitchDrawGBufferPass(rc); rc.DrawInstanced(vertexCountPerInstance, instanceCount, startVertexLocation, startInstanceLocation); EndDrawGBufferPass(rc); }
internal static void DrawIndexedGBufferPass(MyRenderContext rc, int indexCount, int startIndexLocation, int baseVertexLocation) { BeginDrawGBufferPass(rc); rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation); SwitchDrawGBufferPass(rc); rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation); EndDrawGBufferPass(rc); }
internal static void DrawGBufferPass(MyRenderContext rc, int vertexCount, int startVertexLocation) { BeginDrawGBufferPass(rc); rc.Draw(vertexCount, startVertexLocation); SwitchDrawGBufferPass(rc); rc.Draw(vertexCount, startVertexLocation); EndDrawGBufferPass(rc); }
internal static void DrawIndexedInstancedIndirectGBufferPass(MyRenderContext rc, IBuffer bufferForArgsRef, int alignedByteOffsetForArgs) { BeginDrawGBufferPass(rc); rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); SwitchDrawGBufferPass(rc); rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); EndDrawGBufferPass(rc); }
internal static void DrawIndexedInstancedGBufferPass(MyRenderContext RC, int indexCountPerInstance, int instanceCount, int startIndexLocation, int baseVertexLocation, int startInstanceLocation) { BeginDrawGBufferPass(RC); RC.DeviceContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation); SwitchDrawGBufferPass(RC); RC.DeviceContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation); EndDrawGBufferPass(RC); }
internal static void DrawGBufferPass(MyRenderContext RC, int vertexCount, int startVertexLocation) { BeginDrawGBufferPass(RC); RC.DeviceContext.Draw(vertexCount, startVertexLocation); SwitchDrawGBufferPass(RC); RC.DeviceContext.Draw(vertexCount, startVertexLocation); EndDrawGBufferPass(RC); }
internal static void DrawIndexedInstancedIndirectGBufferPass(MyRenderContext RC, Buffer bufferForArgsRef, int alignedByteOffsetForArgs) { BeginDrawGBufferPass(RC); RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); SwitchDrawGBufferPass(RC); RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); EndDrawGBufferPass(RC); }
public static void VSBindRawCB_FrameConstants(MyRenderContext RC) { if (MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN) RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT) RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT) RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); }
public static void CSBindRawCB_FrameConstants(MyRenderContext rc) { if (MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN) rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT) rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT) rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); }
internal static void HandleDeviceReset() { ResetAdaptersList(); DisposeDevice(); CreateDevice(m_windowHandle, m_settings); MyRenderContext.OnDeviceReset(); MyRenderContextPool.OnDeviceReset(); OnDeviceReset(); }
internal static void DrawIndexedBillboards(MyRenderContext RC, int indexCount, int startIndexLocation, int baseVertexLocation) { MyStereoRender.SetViewport(RC, MyStereoRegion.LEFT); RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); RC.DeviceContext.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation); MyStereoRender.SetViewport(RC, MyStereoRegion.RIGHT); RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); RC.DeviceContext.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation); MyStereoRender.SetViewport(RC, MyStereoRegion.FULLSCREEN); RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); }
internal static void DrawIndexedBillboards(MyRenderContext rc, int indexCount, int startIndexLocation, int baseVertexLocation) { MyStereoRender.SetViewport(rc, MyStereoRegion.LEFT); rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation); MyStereoRender.SetViewport(rc, MyStereoRegion.RIGHT); rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation); MyStereoRender.SetViewport(rc, MyStereoRegion.FULLSCREEN); rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); }
internal static void DrawIndexedInstancedIndirectGPUParticles(MyRenderContext rc, Buffer bufferForArgsRef, int alignedByteOffsetForArgs) { rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); SetViewport(rc, MyStereoRegion.LEFT); rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); SetViewport(rc, MyStereoRegion.RIGHT); rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); SetViewport(rc, MyStereoRegion.FULLSCREEN); }
internal static void DrawIndexedInstancedIndirectGPUParticles(MyRenderContext RC, Buffer bufferForArgsRef, int alignedByteOffsetForArgs) { RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); SetViewport(RC, MyStereoRegion.LEFT); RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); SetViewport(RC, MyStereoRegion.RIGHT); RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); SetViewport(RC, MyStereoRegion.FULLSCREEN); }
public static void SetConstants(MyRenderContext rc, ref MyConstantsPack desc, int slot) { if ((desc.BindFlag & MyBindFlag.BIND_VS) > 0) { rc.VertexShader.SetConstantBuffer(slot, desc.CB); } if ((desc.BindFlag & MyBindFlag.BIND_PS) > 0) { rc.PixelShader.SetConstantBuffer(slot, desc.CB); } MyRender11.ProcessDebugOutput(); }
private static void SwitchDrawGBufferPass(MyRenderContext RC) { SetViewport(RC, MyStereoRegion.RIGHT); var viewProjTranspose = Matrix.Transpose(EnvMatricesRightEye.ViewProjectionAt0); var mapping = MyMapping.MapDiscard(RC.DeviceContext, MyCommon.ProjectionConstants); mapping.WriteAndPosition(ref viewProjTranspose); mapping.Unmap(); RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants); //RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.VRFrameConstantsRightEye); }
private static void EndDrawGBufferPass(MyRenderContext RC) { SetViewport(RC, MyStereoRegion.FULLSCREEN); var viewProjTranspose = Matrix.Transpose(MyRender11.Environment.ViewProjectionAt0); var mapping = MyMapping.MapDiscard(RC.DeviceContext, MyCommon.ProjectionConstants); mapping.WriteAndPosition(ref viewProjTranspose); mapping.Unmap(); RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants); //RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); }
private static void BeginDrawGBufferPass(MyRenderContext rc) { SetViewport(rc, MyStereoRegion.LEFT); var viewProjTranspose = Matrix.Transpose(EnvMatricesLeftEye.ViewProjectionAt0); var mapping = MyMapping.MapDiscard(rc, MyCommon.ProjectionConstants); mapping.WriteAndPosition(ref viewProjTranspose); mapping.Unmap(); rc.AllShaderStages.SetConstantBuffer(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants); //RC.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.VRFrameConstantsLeftEye); }
public static void SetViewport(MyRenderContext RC, MyStereoRegion region) { SharpDX.ViewportF viewport = new SharpDX.ViewportF(0, 0, MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y); if (region == MyStereoRegion.LEFT) { viewport = new SharpDX.ViewportF(viewport.X, viewport.Y, viewport.Width / 2, viewport.Height); } else if (region == MyStereoRegion.RIGHT) { viewport = new SharpDX.ViewportF(viewport.X + viewport.Width / 2, viewport.Y, viewport.Width / 2, viewport.Height); } RC.DeviceContext.Rasterizer.SetViewport(viewport); }
internal static void BindProxyGeometry(MyRenderableProxy proxy, MyRenderContext rc) { MyMeshBuffers buffers = proxy.Mesh.Buffers; rc.SetVertexBuffer(0, buffers.VB0); rc.SetVertexBuffer(1, buffers.VB1); if (proxy.InstancingEnabled && proxy.Instancing.VB != null) { rc.SetVertexBuffer(2, proxy.Instancing.VB); } rc.SetIndexBuffer(buffers.IB); }
internal MyRenderingWork_LoopPassThenObject(MyRenderContext deferredRc, List <MyRenderingWorkItem> subworks) { m_isDeferred = true; m_subworks = subworks; AddDeferredContext(deferredRc); foreach (var subwork in subworks) { AddPass(subwork.Pass); subwork.Pass.SetContext(deferredRc); } }
internal void Init(MyRenderContext deferredRc, List<MyRenderingWorkItem> subworks) { m_isDeferred = true; m_subworks.AddList(subworks); AddDeferredContext(deferredRc); foreach (var subwork in subworks) { AddPass(subwork.Pass); subwork.Pass.SetContext(deferredRc); } }
internal void Init(MyRenderContext deferredRc, List <MyRenderingWorkItem> subworks) { m_isDeferred = true; m_subworks.AddList(subworks); AddDeferredContext(deferredRc); foreach (var subwork in subworks) { AddPass(subwork.Pass); subwork.Pass.SetContext(deferredRc); } }
static void BindResources(MyRenderContext RC, bool dualSourceBlending) { if (dualSourceBlending) { RC.BindGBuffer0ForWrite(MyGBuffer.Main, DepthStencilAccess.DepthReadOnly); } else { RC.BindGBufferForWrite(MyGBuffer.Main, DepthStencilAccess.DepthReadOnly); } RC.BindSRV(0, MyGBuffer.Main.DepthStencil.Depth); RC.DeviceContext.PixelShader.SetShaderResource(1, MyRender11.m_gbuffer1Copy.ShaderView); }
internal static void SetSrvs(MyRenderContext rc, ref MySrvTable desc) { if ((desc.BindFlag & MyBindFlag.BIND_VS) > 0) { for (int i = 0; i < desc.Srvs.Length; i++) rc.VertexShader.SetRawSrv(desc.StartSlot + i, desc.Srvs[i]); } if ((desc.BindFlag & MyBindFlag.BIND_PS) > 0) { for (int i = 0; i < desc.Srvs.Length; i++) rc.PixelShader.SetRawSrv(desc.StartSlot + i, desc.Srvs[i]); } MyRender11.ProcessDebugOutput(); }
static void DrawHighlightedPart(MyRenderContext RC, MyPart part, MyInstanceLodState state) { // settings per part (using MyPart.cs): MyShaderBundle shaderBundle = part.GetShaderBundle(state); RC.SetInputLayout(shaderBundle.InputLayout); RC.VertexShader.Set(shaderBundle.VertexShader); RC.PixelShader.Set(shaderBundle.PixelShader); // (using MyHighlightPass.cs): RC.SetRasterizerState(null); RC.DrawIndexed(part.IndicesCount, part.StartIndex, part.StartVertex); }
public static void CSBindRawCB_FrameConstants(MyRenderContext rc) { if (MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN) { rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); } else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT) { rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); } else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT) { rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); } }
public static void VSBindRawCB_FrameConstants(MyRenderContext RC) { if (MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN) { RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); } else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT) { RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); } else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT) { RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); } }
public static unsafe void MoveConstants(MyRenderContext rc, ref MyConstantsPack desc) { if (desc.CB == null) return; // IMPORTANT: It is optimisation but that has not been very well implemented, it is not considered multithread approach, usage of buffers in multiple passes, // reset device and and refillage of the buffers. More complex task to do it properly //if (m_staticData.m_constantsVersion.Get(desc.CB) != desc.Version) //{ // m_staticData.m_constantsVersion[desc.CB] = desc.Version; var mapping = MyMapping.MapDiscard(rc, desc.CB); mapping.WriteAndPosition(desc.Data, 0, desc.Data.Length); mapping.Unmap(); //} //MyRender11.ProcessDebugOutput(); }
private static MyMapping MapRead(MyRenderContext rc, IResource resource, int bufferSize) { MyMapping mapping; mapping.m_rc = rc; mapping.m_resource = resource.Resource; mapping.m_bufferSize = bufferSize; mapping.m_dataBox = rc.MapSubresource(resource, 0, MapMode.Read, MapFlags.None); if (mapping.m_dataBox.IsEmpty) { throw new MyRenderException("Resource mapping failed!"); } mapping.m_dataPointer = mapping.m_dataBox.DataPointer; return(mapping); }
internal static void Combine(RwTexId targetArray, MyShadowCascades firstCascades, MyShadowCascades secondCascades) { if (!MyRender11.Settings.EnableShadows) { return; } ProfilerShort.Begin("MyShadowCascadesPostProcess.Combine"); MyGpuProfiler.IC_BeginBlock("MyShadowCascadesPostProcess.Combine"); firstCascades.FillConstantBuffer(firstCascades.CascadeConstantBuffer); secondCascades.FillConstantBuffer(secondCascades.CascadeConstantBuffer); secondCascades.PostProcessor.MarkCascadesInStencil(secondCascades.CascadeInfo); MyRenderContext renderContext = MyRenderContext.Immediate; DeviceContext deviceContext = renderContext.DeviceContext; deviceContext.PixelShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); deviceContext.PixelShader.SetConstantBuffer(10, firstCascades.CascadeConstantBuffer); deviceContext.PixelShader.SetConstantBuffer(11, secondCascades.CascadeConstantBuffer); deviceContext.PixelShader.SetConstantBuffer(12, m_inverseConstants); for (int subresourceIndex = 0; subresourceIndex < targetArray.Description2d.ArraySize; ++subresourceIndex) { renderContext.BindGBufferForRead(0, MyGBuffer.Main); deviceContext.OutputMerger.SetTargets((DepthStencilView)null, (RenderTargetView)targetArray.SubresourceRtv(subresourceIndex)); deviceContext.PixelShader.SetShaderResource(0, firstCascades.CascadeShadowmapArray.SubresourceSrv(subresourceIndex)); deviceContext.PixelShader.SetShaderResource(1, secondCascades.CascadeShadowmapArray.ShaderView); //deviceContext.PixelShader.SetShaderResource(4, MyGBuffer.Main.DepthStencil.m_SRV_stencil); renderContext.SetPS(m_combinePS); Matrix inverseCascadeMatrix = MatrixD.Transpose(MatrixD.Invert(firstCascades.CascadeInfo[subresourceIndex].CurrentLocalToProjection * MyMatrixHelpers.ClipspaceToTexture)); var mapping = MyMapping.MapDiscard(m_inverseConstants); mapping.WriteAndPosition(ref inverseCascadeMatrix); mapping.Unmap(); MyScreenPass.DrawFullscreenQuad(new MyViewport(0, 0, targetArray.Description2d.Width, targetArray.Description2d.Height)); } deviceContext.OutputMerger.SetTargets(null as DepthStencilView, null as RenderTargetView); deviceContext.PixelShader.SetShaderResource(0, null); deviceContext.PixelShader.SetShaderResource(1, null); deviceContext.PixelShader.SetShaderResource(2, null); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); }
private static MyMapping MapDiscard(MyRenderContext rc, Resource buffer, int bufferSize) { MyMapping mapping; mapping.m_rc = rc; mapping.m_buffer = buffer; mapping.m_bufferSize = bufferSize; mapping.m_dataBox = rc.MapSubresource(buffer, 0, MapMode.WriteDiscard, MapFlags.None); if (mapping.m_dataBox.IsEmpty) { throw new MyRenderException("Resource mapping failed!"); } mapping.m_dataPointer = mapping.m_dataBox.DataPointer; return(mapping); }
static internal void FreeRC(MyRenderContext rc) { Debug.Assert(rc.OkToRelease); m_pool.Return(rc); }
internal static CommandList JoinAndGetCommandList(MyRenderContext rc) { MyGpuProfiler.Join(rc.ProfilingQueries); return rc.FinishCommandList(false); }
internal static void BindProxyGeometry(MyRenderableProxy proxy, MyRenderContext renderContext) { MyMeshBuffers buffers; if(proxy.Mesh != LodMeshId.NULL) buffers = proxy.Mesh.Buffers; else buffers = proxy.MergedMesh.Buffers; bool firstChanged = renderContext.UpdateVB(0, buffers.VB0.Buffer, buffers.VB0.Stride); bool secondChanged = renderContext.UpdateVB(1, buffers.VB1.Buffer, buffers.VB1.Stride); if (firstChanged && secondChanged) { renderContext.DeviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(buffers.VB0.Buffer, buffers.VB0.Stride, 0)); renderContext.DeviceContext.InputAssembler.SetVertexBuffers(1, new VertexBufferBinding(buffers.VB1.Buffer, buffers.VB1.Stride, 0)); renderContext.Stats.SetVB++; } else if (firstChanged) { renderContext.DeviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(buffers.VB0.Buffer, buffers.VB0.Stride, 0)); renderContext.Stats.SetVB++; } else if (secondChanged) { renderContext.DeviceContext.InputAssembler.SetVertexBuffers(1, new VertexBufferBinding(buffers.VB1.Buffer, buffers.VB1.Stride, 0)); renderContext.Stats.SetVB++; } if (proxy.InstancingEnabled && proxy.Instancing.VB.Index != -1) { renderContext.DeviceContext.InputAssembler.SetVertexBuffers(2, new VertexBufferBinding(proxy.Instancing.VB.Buffer, proxy.Instancing.VB.Stride, 0)); renderContext.Stats.SetVB++; } renderContext.SetIB(buffers.IB.Buffer, buffers.IB.Format); }
internal static void BindProxyGeometry(MyRenderableProxy proxy, MyRenderContext rc) { MyMeshBuffers buffers; if(proxy.Mesh != LodMeshId.NULL) buffers = proxy.Mesh.Buffers; else buffers = proxy.MergedMesh.Buffers; rc.SetVertexBuffer(0, buffers.VB0); rc.SetVertexBuffer(1, buffers.VB1); if (proxy.InstancingEnabled && proxy.Instancing.VB != null) { rc.SetVertexBuffer(2, proxy.Instancing.VB); } rc.SetIndexBuffer(buffers.IB); }
public static void SetViewport(MyRenderContext RC, MyStereoRegion region) { SharpDX.ViewportF viewport = new SharpDX.ViewportF(0, 0, MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y); if (region == MyStereoRegion.LEFT) viewport = new SharpDX.ViewportF(viewport.X, viewport.Y, viewport.Width / 2, viewport.Height); else if (region == MyStereoRegion.RIGHT) viewport = new SharpDX.ViewportF(viewport.X + viewport.Width / 2, viewport.Y, viewport.Width / 2, viewport.Height); RC.DeviceContext.Rasterizer.SetViewport(viewport); }
internal void AddDeferredContext(MyRenderContext rc) { Contexts.Add(rc); }
static MyRenderContextPool() { Immediate = new MyRenderContext(MyRender11.ImmediateContext, false); }
internal void Cleanup() { m_RC = null; }
internal void SetContext(MyRenderContext rc) { Debug.Assert(!m_isImmediate && m_RC == null); m_RC = rc; }
internal MyRenderingWork_LoopPassThenObject(MyRenderContext deferredRc, List<MyRenderingWorkItem> subworks) { m_isDeferred = true; m_subworks = subworks; AddDeferredContext(deferredRc); foreach(var subwork in subworks) { AddPass(subwork.Pass); subwork.Pass.SetContext(deferredRc); } }
// this method set viewport that is related to the current MyStereoRender.RenderRegion flag public static void SetViewport(MyRenderContext RC) { SetViewport(RC, MyStereoRender.RenderRegion); }
protected void AddDeferredContext(MyRenderContext rc) { Contexts.Add(rc); }
internal static unsafe void FillBuffers(MyRenderableProxy proxy, MyRenderContext rc) { MyMapping mapping; mapping = MyMapping.MapDiscard(rc, proxy.ObjectBuffer); if(proxy.NonVoxelObjectData.IsValid) { mapping.WriteAndPosition(ref proxy.NonVoxelObjectData); } else if (proxy.VoxelCommonObjectData.IsValid) { mapping.WriteAndPosition(ref proxy.VoxelCommonObjectData); } mapping.WriteAndPosition(ref proxy.CommonObjectData); if (proxy.SkinningMatrices != null) { if (proxy.DrawSubmesh.BonesMapping == null) { mapping.WriteAndPosition(proxy.SkinningMatrices, Math.Min(MyRender11Constants.SHADER_MAX_BONES, proxy.SkinningMatrices.Length)); } else { for (int j = 0; j < proxy.DrawSubmesh.BonesMapping.Length; j++) { mapping.WriteAndPosition(ref proxy.SkinningMatrices[proxy.DrawSubmesh.BonesMapping[j]]); } } } mapping.Unmap(); }
internal static void DrawIndexedInstancedIndirectGPUParticles(MyRenderContext rc, IBuffer bufferForArgsRef, int alignedByteOffsetForArgs) { rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye); SetViewport(rc, MyStereoRegion.LEFT); rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye); SetViewport(rc, MyStereoRegion.RIGHT); rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs); rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants); SetViewport(rc, MyStereoRegion.FULLSCREEN); }
public static void BindShaderBundle(MyRenderContext rc, MyMaterialShadersBundleId id) { rc.SetInputLayout(id.IL); rc.VertexShader.Set(id.VS); rc.PixelShader.Set(id.PS); }
internal virtual void Cleanup() { m_RC = null; if(Locals != null) Locals.Clear(); Stats.Clear(); m_joined = false; m_currentProfilingBlock_renderableType = -1; m_currentProfilingBlock_renderableMaterial = string.Empty; m_isImmediate = false; ViewProjection = default(Matrix); Viewport = default(MyViewport); DebugName = string.Empty; ProcessingMask = 0; }