示例#1
0
        public void SetRenderTargets(IDepthStencilView depthStencilView, IRenderTargetView renderTargetView0, IRenderTargetView renderTargetView1 = null, IRenderTargetView renderTargetView2 = null, IRenderTargetView renderTargetView3 = null)
        {
            var dsv  = (DepthStencilViewBox)depthStencilView;
            var rtv0 = (RenderTargetViewBox)renderTargetView0;
            var rtv1 = (RenderTargetViewBox)renderTargetView1;
            var rtv2 = (RenderTargetViewBox)renderTargetView2;
            var rtv3 = (RenderTargetViewBox)renderTargetView3;

            if (_currentDepthStencilView == dsv &&
                _currentRenderTargetViews[0] == rtv0 &&
                _currentRenderTargetViews[1] == rtv1 &&
                _currentRenderTargetViews[2] == rtv2 &&
                _currentRenderTargetViews[3] == rtv3)
            {
                return;
            }

            _currentDepthStencilView     = dsv;
            _currentRenderTargetViews[0] = rtv0;
            _currentRenderTargetViews[1] = rtv1;
            _currentRenderTargetViews[2] = rtv2;
            _currentRenderTargetViews[3] = rtv3;

            UpdateRenderTargetsInternal();
        }
示例#2
0
        public RenderToTextureScene(IEye eye, DisplayMode desctopDisplayMode)
            : base(eye, desctopDisplayMode)
        {
            var vertexShader = Device.Create.VertexShader(ShaderParser.Parse(VertexShaderText));
            var pixelShader = Device.Create.PixelShader(ShaderParser.Parse(PixelShaderText));
            shaderCombination = Device.Create.ShaderCombination(vertexShader, null, null, null, pixelShader);

            var meshFactory = new MeshFactory(Device, Handedness.Right, Winding.Clockwise);
            cubeMesh = meshFactory.CreateCube(2.0f);

            vertexLayout = Device.Create.VertexLayout(vertexShader, new[]
            {
                new VertexLayoutElement(ExplicitFormat.R32G32B32_FLOAT, 0, 0),
                new VertexLayoutElement(ExplicitFormat.R32G32B32_FLOAT, 0, 12),
                new VertexLayoutElement(ExplicitFormat.R32G32_FLOAT, 0, 24)
            });

            transformBuffer = Device.Create.Buffer(
                new BufferDescription { SizeInBytes = Transform.SizeInBytes, BindFlags = BindFlags.UniformBuffer, Usage = Usage.Dynamic });
            cameraVertexBuffer = Device.Create.Buffer(
                new BufferDescription { SizeInBytes = CameraVertex.SizeInBytes, BindFlags = BindFlags.UniformBuffer, Usage = Usage.Dynamic });
            lightBuffer = Device.Create.Buffer(
                new BufferDescription { SizeInBytes = Light.SizeInBytes, BindFlags = BindFlags.UniformBuffer, Usage = Usage.Dynamic });

            var renderTargetFormats = Eye.Adapters[0]
                .GetSupportedFormats(FormatSupport.Texture2D | FormatSupport.RenderTarget | FormatSupport.MipAutogen)
                .Where(fi => fi.ColorBits <= 24);
            if (!renderTargetFormats.Any()) throw new NotSupportedException("Render target textures are not supported.");
            var renderTargetFormatInfo = renderTargetFormats
                .OrderByDescending(fi => fi.ColorBits)
                .ThenBy(fi => fi.TotalBits)
                .First();

            var renderTargetTexture = Device.Create.Texture2D(new Texture2DDescription
            {
                Width = TargetSize,
                Height = TargetSize,
                MipLevels = TextureHelper.MipLevels(TargetSize, TargetSize, 1),
                ArraySize = 1,
                FormatID = renderTargetFormatInfo.ID,
                Sampling = Sampling.NoMultisampling,
                Usage = Usage.Default,
                BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
                MiscFlags = MiscFlags.GenerateMips,
                ExtraFlags = ExtraFlags.None
            });
            targetRtv = renderTargetTexture.ViewAsRenderTarget(renderTargetFormatInfo.ID, 0);
            targetSrv = renderTargetTexture.ViewAsShaderResource(renderTargetFormatInfo.ID, 0, renderTargetTexture.MipLevels);

            var dsFormats = Eye.Adapters[0].GetSupportedFormats(FormatSupport.Texture2D | FormatSupport.DepthStencil);
            var dsFormatInfo = dsFormats
                .OrderBy(fi => (fi.ColorBits == 24 && fi.AlphaBits == 8) ? 0 : 1)
                .ThenByDescending(fi => fi.ColorBits)
                .ThenBy(fi => fi.TotalBits)
                .First();

            var depthStencilTexture = Device.Create.Texture2D(new Texture2DDescription
            {
                Width = TargetSize,
                Height = TargetSize,
                MipLevels = 1,
                ArraySize = 1,
                FormatID = dsFormatInfo.ID,
                Sampling = Sampling.NoMultisampling,
                Usage = Usage.Default,
                BindFlags = BindFlags.DepthStencil,
                MiscFlags = MiscFlags.None,
                ExtraFlags = ExtraFlags.None
            });
            targetDsv = depthStencilTexture.ViewAsDepthStencil(dsFormatInfo.ID, DepthStencilViewFlags.None, 0);

            var textureLoader = new TextureLoader(Device);

            var diffuseTexture = textureLoader.Load("../Textures/DiffuseTest.png");
            diffuseView = diffuseTexture.ViewAsShaderResource(diffuseTexture.FormatID, 0, diffuseTexture.MipLevels);

            samplerState = Device.Create.SamplerState(SamplerDescription.Anisotropic);
            depthStencilState = Device.Create.DepthStencilState(DepthStencilDescription.Enabled);
        }
示例#3
0
        private void RenderScene_Forward(IDeviceContext context, SceneSnapshot scene, IDepthStencilView backBufferDepthStencilView, IRenderTargetView backBufferRenderTargetView)
        {
            RenderShadowMaps(context, scene);

            // Restore backbuffer rendertarget + scene constant buffer + srvs.
            context.SetRenderTargets(backBufferDepthStencilView, backBufferRenderTargetView);
            context.SetViewportRect(new RectangleF(0, 0, backBufferRenderTargetView.Resolution.Width, backBufferRenderTargetView.Resolution.Height));
            UpdateSceneConstantBuffer(context, new Vector4(scene.CameraEye, 1.0f), scene.ProjView, scene.ProjViewInv, scene.ProjView, scene.ProjViewInv, true, true, scene.SpotlightInfos.Count, scene.Time);

            // Clear render/depth, bind srvs after setrendertargets
            context.ClearRenderTarget(Color.Gray);
            context.ClearDepthBuffer(1.0f);
            BindCommonShaderResourceViews(context);

            // Atmosphere
            if (false)
            {
                _techniques.ForwardSkyFromAtmosphere.BeginPass(context, 0);
                context.SetDepthConfiguration(DepthConfiguration.Disabled);
                var(orthoProj, world) = ComputeSceneQuadProjWorld(backBufferRenderTargetView.Resolution, 0, 0, backBufferRenderTargetView.Resolution.Width, backBufferRenderTargetView.Resolution.Height);
                UpdateSceneConstantBuffer(context, new Vector4(scene.CameraEye, 1), orthoProj, MatrixCM.Invert(orthoProj), scene.ProjView, MatrixCM.Invert(scene.ProjView), false, false, scene.SpotlightInfos.Count, scene.Time);
                UpdateBatchConstantBuffer(context, Matrix.Identity, DiffuseTextureSamplingMode.FlatUV, 0);
                DrawScreenQuad(context, world, null);
                context.SetDepthConfiguration(DepthConfiguration.Enabled);
                {
                    var projViewInv = MatrixCM.Invert(scene.ProjView);
                    projViewInv.Transpose();
                    var a = Vector4.Transform(new Vector4(0, 0, 1, 1), projViewInv);
                    a /= a.W;
                    var av = (Vector3)a;
                    av.Normalize();
                    var b = Vector4.Transform(new Vector4(1, 0, 1, 1), projViewInv);
                    b /= b.W;
                    var bv = (Vector3)b;
                    bv.Normalize();
                    var c = Vector4.Transform(new Vector4(0, 1, 1, 1), projViewInv);
                    c /= c.W;
                    var cv = (Vector3)c;
                    cv.Normalize();
                    Console.WriteLine(av + " " + bv + " " + cv);
                }
            }

            // Water
            if (false)
            {
                var pv = scene.ProjView;
                pv.Transpose();
                Console.WriteLine("!!!!!" + Vector3.Transform(new Vector3(-5.00f, -2.18557e-07f, -5.00f), pv));

                _techniques.ForwardWater.BeginPass(context, 0);
                UpdateSceneConstantBuffer(context, new Vector4(scene.CameraEye, 1), scene.ProjView, scene.ProjViewInv, scene.ProjView, scene.ProjViewInv, false, false, scene.SpotlightInfos.Count, scene.Time);
                UpdateBatchConstantBuffer(context, Matrix.Identity, DiffuseTextureSamplingMode.FlatUV, 0);
                var instancingBuffer = PickInstancingBuffer(8192);
                context.SetVertexBuffer(1, instancingBuffer);
                int n = 40;
                using (var updater = context.TakeUpdater(instancingBuffer)) {
                    for (var y = -n; y <= n; y++)
                    {
                        for (var x = -n; x <= n; x++)
                        {
                            updater.Write(new RenderJobDescription {
                                WorldTransform         = MatrixCM.Scaling(10) * MatrixCM.Translation(x, 0, y) * MatrixCM.RotationX(-(float)Math.PI / 2.0f) * MatrixCM.Translation(-0.5f, -0.5f, 0),
                                MaterialProperties     = { Metallic = 0.0f, Roughness = 1.0f },
                                MaterialResourcesIndex = -1,
                                Color = Color.White,
                            });
                        }
                    }
                }
                context.SetShaderResource(30, _graphicsFacade.Presets.SolidTextures[Color4.White], RenderStage.Pixel);
                var mrbu = context.TakeUpdater(_materialResourcesBuffer);
                mrbu.Write(new InternalMaterialResourcesDescription()
                {
                    BaseColor = Color4.White
                }.Resolve(30));
                mrbu.UpdateCloseAndDispose();
                water.Render(context, (2 * n + 1) * (2 * n + 1));
            }

            // Forward render pass
            for (var pass = 0; pass < _techniques.Forward.Passes; pass++)
            {
                _techniques.Forward.BeginPass(context, pass);
                foreach (var batch in scene.RenderJobBatches)
                {
                    RenderBatch(context, scene, batch);
                }
            }
        }
示例#4
0
 public void GetBackBufferViews(out IDepthStencilView dsv, out IRenderTargetView rtv)
 {
     dsv = _backBufferDepthView;
     rtv = _backBufferRenderTargetView;
 }