Esempio n. 1
0
        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;
            }
        }