SLIMDX抗锯齿

时间:2011-10-20 10:03:06

标签: antialiasing slimdx

我尝试从互联网上找到的tuturial获得高质量的抗锯齿效果(http://www.rkoenig.eu/index.php?option=com_content&view=article&id=21:chapter-3- DAS-一个吧-echte-3D-OBJEKT&安培; CATID = 6:DirectX10的-基础&安培; ITEMID = 3)。但没有达到很好的解决方案。

我已经将多重采样设置为最大值:

m_swapChainDesc.SampleDescription = new DXGI.SampleDescription(8,0);

对我看来,渲染图像的像素大小大于我屏幕的实际像素大小。

非常感谢您提供的宝贵意见

这是完整的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SlimDX;

using DX10 = SlimDX.Direct3D10;
using DXGI = SlimDX.DXGI;

namespace TutorialSeries.DirectX10.Chapter3
{
    public partial class MainWindow : Form
    {
        private DX10.Device m_device;
        private DXGI.SwapChainDescription m_swapChainDesc;
        private DXGI.SwapChain m_swapChain;
        private DXGI.Factory m_factory;
        private DX10.RenderTargetView m_renderTarget;
        private bool m_initialized;

        private SimpleBox m_simpleBox;

        private Matrix m_viewMatrix;
        private Matrix m_projMatrix;
        private Matrix m_worldMatrix;
        private Matrix m_viewProjMatrix;

        public MainWindow()
        {
            InitializeComponent();

            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.Opaque, true);
        }

        /// <summary>
        /// Initializes device and other resources needed for rendering. Returns true, if successful.
        /// </summary>
        private bool Initialize3D()
        {
            try
            {
                m_device = new DX10.Device(DX10.DriverType.Warp, DX10.DeviceCreationFlags.SingleThreaded);

                m_factory = new DXGI.Factory();

                m_swapChainDesc = new DXGI.SwapChainDescription();
                m_swapChainDesc.OutputHandle = this.Handle;
                m_swapChainDesc.IsWindowed = true;
                m_swapChainDesc.BufferCount = 1;
                m_swapChainDesc.Flags = DXGI.SwapChainFlags.AllowModeSwitch;
                m_swapChainDesc.ModeDescription = new DXGI.ModeDescription(
                    this.Width,
                    this.Height,
                    new Rational(60, 1),
                    DXGI.Format.R8G8B8A8_UNorm);
                m_swapChainDesc.SampleDescription = new DXGI.SampleDescription(8,0);
                m_swapChainDesc.SwapEffect = DXGI.SwapEffect.Discard;
                m_swapChainDesc.Usage = DXGI.Usage.RenderTargetOutput;

                m_swapChain = new DXGI.SwapChain(m_factory, m_device, m_swapChainDesc);



                DX10.Viewport viewPort = new DX10.Viewport();
                viewPort.X = 0;
                viewPort.Y = 0;
                viewPort.Width = this.Width;
                viewPort.Height = this.Height;
                viewPort.MinZ = 0f;
                viewPort.MaxZ = 1f;

                //DX10.Texture2D backBuffer = m_swapChain.GetBuffer<DX10.Texture2D>(0);
                DX10.Texture2D Texture = DX10.Texture2D.FromSwapChain<DX10.Texture2D>(m_swapChain,0);

                //m_renderTarget = new DX10.RenderTargetView(m_device, backBuffer);
                //DX10.RenderTargetViewDescription renderDesc = new DX10.RenderTargetViewDescription();
                //renderDesc.FirstArraySlice = 0;
                //renderDesc.MipSlice = 0;

                m_renderTarget = new DX10.RenderTargetView(m_device, Texture);

                Texture.Dispose();

                DX10.RasterizerStateDescription rsd = new DX10.RasterizerStateDescription();
                rsd.CullMode = DX10.CullMode.Back;
                rsd.FillMode = DX10.FillMode.Wireframe;
                rsd.IsMultisampleEnabled = true;
                rsd.IsAntialiasedLineEnabled = false;
                rsd.IsDepthClipEnabled = false;
                rsd.IsScissorEnabled = false;

               DX10.RasterizerState RasterStateWireFrame = DX10.RasterizerState.FromDescription(m_device,rsd);

                DX10.BlendStateDescription blendDesc = new DX10.BlendStateDescription();
                blendDesc.BlendOperation = DX10.BlendOperation.Add;
                blendDesc.AlphaBlendOperation = DX10.BlendOperation.Add;
                blendDesc.SourceAlphaBlend = DX10.BlendOption.Zero;
                blendDesc.DestinationAlphaBlend = DX10.BlendOption.Zero;
                blendDesc.SourceBlend = DX10.BlendOption.SourceColor;
                blendDesc.DestinationBlend = DX10.BlendOption.Zero;
                blendDesc.IsAlphaToCoverageEnabled = false;
                blendDesc.SetWriteMask(0, DX10.ColorWriteMaskFlags.All);
                blendDesc.SetBlendEnable(0, true);
                DX10.BlendState m_blendState = DX10.BlendState.FromDescription(m_device, blendDesc);

                m_device.Rasterizer.State = RasterStateWireFrame;
                m_device.Rasterizer.SetViewports(viewPort);
                m_device.OutputMerger.BlendState = m_blendState;
                m_device.OutputMerger.SetTargets(m_renderTarget);

                m_viewMatrix = Matrix.LookAtLH(
                    new Vector3(0f, 0f, -4f),
                    new Vector3(0f, 0f, 1f),
                    new Vector3(0f, 1f, 0f));
                m_projMatrix = Matrix.PerspectiveFovLH(
                    (float)Math.PI * 0.5f,
                    this.Width / (float)this.Height,
                    0.1f, 100f);
                m_viewProjMatrix = m_viewMatrix * m_projMatrix;
                m_worldMatrix = Matrix.RotationYawPitchRoll(0.85f, 0.85f, 0f);

                m_simpleBox = new SimpleBox();
                m_simpleBox.LoadResources(m_device);

                m_initialized = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error while initializing Direct3D10: \n" + ex.Message);
                m_initialized = false;
            }

            return m_initialized;
        }

        /// <summary>
        /// Rendering is done during the standard OnPaint event
        /// </summary>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            if (m_initialized)
            {
                m_device.ClearRenderTargetView(m_renderTarget, new Color4(Color.CornflowerBlue));

                m_simpleBox.Render(m_device, m_worldMatrix, m_viewProjMatrix);

                m_swapChain.Present(0, DXGI.PresentFlags.None);
            }
        }



        /// <summary>
        /// Initialize 3D-Graphics within OnLoad event
        /// </summary>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Initialize3D();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这是一个古老的问题,但遗憾的是它从未得到回答;我在Google上偶然发现了它,所以我想回答它可能会帮助其他人......

首先,Pascal,你没有将MSAA设置为最大值......你使用的是8:0,这意味着质量为0(零)的8个样本......绝对不是最大值。 “max”取决于本地计算机上安装的GPU。所以它因PC而异。这就是为什么DirectX应用程序需要使用DXGI来正确枚举硬件设备并确定哪些设置有效。这不是一个微不足道的话题,需要你做一些自己的研究和实践。 DirectX SDK文档和示例/教程是一个很好的起点,并且还有很多其他材料可以在网上找到。但是在我的机器上,例如,我的GTX-580 GPU可以支持8:16 MSAA(可能更高,但尚未检查)。

因此,您需要学习使用DXGI来枚举您的图形卡和显示器,并找出它可以支持的MSAA级别(以及其他图形功能/设置)。例如,这是您能够找出“最大”MSAA设置或显示器正确刷新率的唯一方法。如果你很聪明,你会自己为你的游戏引擎编写一个小型库或组件,它将为你枚举硬件设备并找出最佳的图形设置,这样你就不必为将来的项目重复这样做。

此致

- ATC -