SLIMDX сглаживание - PullRequest
       19

SLIMDX сглаживание

1 голос
/ 20 октября 2011

Я пытаюсь получить высококачественный сглаживающий материал из обучающего материала, который я нашел в Интернете (http://www.rkoenig.eu/index.php?option=com_content&view=article&id=21:chapter-3-das-erste-echte-3d-objekt&catid=6:directx10-basics&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 голосов
/ 26 октября 2012

Это старый вопрос, но обидно, что он так и не получил ответа; Я наткнулся на это в Google, поэтому думаю, что ответ на него может помочь кому-то еще в будущем ...

Прежде всего, Паскаль, вы НЕ установили MSAA на максимум ... Вы используете 8: 0, что означает 8 выборок с качеством 0 (ноль) ... определенно не максимум. Значение «max» зависит от графического процессора, установленного на локальной машине. Так что это варьируется от ПК к ПК. Вот почему приложение DirectX должно использовать DXGI для правильного перечисления аппаратных устройств и определения допустимых настроек. Это нетривиальная тема, которая потребует от вас самостоятельных исследований и практики. Документация DirectX SDK и примеры / учебные пособия - отличная отправная точка, и есть много других материалов, которые можно найти в Интернете. Но на моей машине, например, мой графический процессор GTX-580 может поддерживать MSAA 8:16 (возможно, выше, но не проверял).

Итак, вам нужно научиться использовать DXGI для перечисления ваших видеокарт и мониторов и выяснить, какие уровни MSAA (и другие графические функции / настройки) он может поддерживать. Это единственный способ, например, определить «максимальные» параметры MSAA или правильную частоту обновления вашего монитора. Если вы сообразительны, вы напишите себе небольшую библиотеку или компонент для игрового движка, который будет перечислять аппаратные устройства для вас и определять оптимальные настройки графики, чтобы вам не приходилось делать это снова и снова для будущих проектов.

С уважением,

- ATC -

...