Gamebryo实例学习之五DX9MSAATextures

一、简介

       MSAA意思是多层采样抗锯齿。Gamebryo的NiRenderTextures类都有一个与之相关的多层采样,但是在DX9中,几乎不可能直接使用MSAA绘制一张texture,因为不规格的textures很难取得每个像素的多层采样,这就意味着绘制纹理的渲染技术都不能使用MSAA的好处。幸运的是,这里有一个解决方案,DX9将允许应用程序创建和绘制一个启用了MSAA的RenderTarget,应用程序可以从RenderTarget那里拷贝数据到渲染纹理,虽然会降低绘制数据的采样率,但使用了MSAA的渲染图像仍然有一定的画质提高。
       DX9MSAATextures这个实例就使用了这个方案,一个场景全由一张贴图贴在全屏几何网格上,这种模型一般用在后期特效上,比如GlowEffect。但是DX9MSAATextures没有用到像素着色器,因为这样可以使渲染纹理不被干扰的绘制的更清晰。
       这个例子可以直接使用渲染场景的渲染纹理,也可以利用一个RenderTarget,如果启用了MSAA,那么也会创建相同级别层次MSAA的RenderTarget,当然如果初始化没有设置MSAA,那么两者看起来将会是一样的。

二、解析
       RecursivePrepareScene,如果是光线,就让整个场景接受同样的光线,然后子节点也随之循环渲染。
       获取后备缓冲,然后创建一张贴图,再由这张贴图创建一个RenderTarget。
       Ni2DBuffer* pkDefaultBackBuffer = m_spRenderer->GetDefaultBackBuffer();
       m_spTexture = NiRenderedTexture::Create(GetWidth(), GetHeight(), m_spRenderer);
       m_spTarget = NiRenderTargetGroup::Create(m_spTexture->GetBuffer(),m_spRenderer);
       而MSAA,这需要先获取创建参数,然后由DXDevice创建一个Surface,最后转为RenderTarget。
       pkDX9Renderer->GetCreationParameters();
       LPDIRECT3DDEVICE9 pkDevice = pkDX9Renderer->GetD3DDevice();
       pkDevice->CreateRenderTarget();
       最后把RenderTarget复制到一个RenderClick里去,再把这个Click加到默认Step中主Click之后。
       也需要了解Frame->Step->Click-View的帧渲染结构。

三、百科
       
       MSAA
是“多重采样抗锯齿”,可以使画面更加平滑。
       多重采样 抗锯齿(MultiSampling Anti-Aliasing)的原理就是把当前分辨率成倍提高,然后再把画缩放到当前的显示器上。这样的做法实际上就是在显示尺寸不变的情况提高分辨率,让单个像素变得极小,这样就能够大幅减轻画面的锯齿感了。不过是由于对整个显示画面的放大,因此它消耗的显示资源也是非常大的。不过MSAA是寻找出物体边缘部分的像素,然后对它们进行缩放处理。由于只是物体的外层像素进行缩放处理,忽略掉了不会产生锯齿的内部像素,所以显卡不会像处理SSAA( 超级采样抗锯齿那样需要庞大的计算量,因此MSAA比起SSAA来更有效。


      

    


你可能感兴趣的:(gb)