public void Render(DeviceContext context, Camera camera, Int2 screenResolution, Span <TInstance> instances, int start, int count) { var vertexConstantsData = new RayTracedVertexConstants { Projection = Matrix.Transpose(camera.Projection), //compensate for the shader packing. CameraPosition = camera.Position, CameraRight = camera.Right, NearClip = camera.NearClip, CameraUp = camera.Up, CameraBackward = camera.Backward, }; vertexConstants.Update(context, ref vertexConstantsData); var viewportHeight = 2 * (float)Math.Tan(camera.FieldOfView / 2); var viewportWidth = viewportHeight * camera.AspectRatio; var pixelConstantsData = new RayTracedPixelConstants { CameraRight = camera.Right, NearClip = camera.NearClip, CameraUp = camera.Up, FarClip = camera.FarClip, CameraBackward = camera.Backward, PixelSizeAtUnitPlane = new Vector2(viewportWidth / screenResolution.X, viewportHeight / screenResolution.Y) }; pixelConstants.Update(context, ref pixelConstantsData); //This assumes that render states have been set appropriately for opaque rendering. context.InputAssembler.InputLayout = null; context.InputAssembler.SetIndexBuffer(indices); context.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList; context.VertexShader.Set(vertexShader); context.VertexShader.SetConstantBuffer(0, vertexConstants.Buffer); context.VertexShader.SetShaderResource(0, this.instances.SRV); context.PixelShader.Set(pixelShader); context.PixelShader.SetConstantBuffer(1, pixelConstants.Buffer); while (count > 0) { var batchCount = Math.Min(this.instances.Capacity, count); this.instances.Update(context, instances, batchCount, start); context.DrawIndexed(batchCount * 36, 0, 0); count -= batchCount; start += batchCount; } }
public void Render(Camera camera, Int2 screenResolution, Span <TInstance> instances, int start, int count) { Use(); indices.Bind(); vertexConstants.Bind(0); this.instances.Bind(0); pixelConstants.Bind(1); var vertexConstantsData = new RayTracedVertexConstants { Projection = camera.Projection, CameraPosition = camera.Position, CameraRight = camera.Right, NearClip = camera.NearClip, CameraUp = camera.Up, CameraBackward = camera.Backward, }; vertexConstants.Update(ref vertexConstantsData); var viewportHeight = 2 * (float)Math.Tan(camera.FieldOfView / 2); var viewportWidth = viewportHeight * camera.AspectRatio; var pixelConstantsData = new RayTracedPixelConstants { CameraRight = camera.Right, NearClip = camera.NearClip, CameraUp = camera.Up, FarClip = camera.FarClip, CameraBackward = camera.Backward, PixelSizeAtUnitPlane = new Vector2(viewportWidth / screenResolution.X, viewportHeight / screenResolution.Y) }; pixelConstants.Update(ref pixelConstantsData); while (count > 0) { var batchCount = Math.Min(this.instances.Capacity, count); this.instances.Update(instances, batchCount, start); GL.DrawElements(PrimitiveType.Triangles, 36 * batchCount, indices.Type, 0); count -= batchCount; start += batchCount; } }