SDL中的Anti-aliasing

  默认情况下,SDL2中默认是不启用MSAA.为了能启用,必须做些设置.如果渲染器工作在OpenGL/ES模式下,那么直接使用:

        SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,1);

        SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,n);

即可,如果再windows下,渲染器会自动选择D3D作为渲染接口,那么我们要强行把渲染设备切换到OpenGL模式:

        SDL_SetHint(SDL_HINT_RENDER_DRIVER,"opengl");


但是在DirectX中如何设置MSAA呢,查看SDL2源码发现:

         D3DPRESENT_PARAMETERS pparams;

         ... ...

         result = IDirect3D9_CreateDevice(data->d3d, data->adapter,

                                     D3DDEVTYPE_HAL,

                                     pparams.hDeviceWindow,

                                     device_flags,

                                     &pparams, &data->device);

这是SDL2初始化D3D设备的一段代码,根据MSDN,设置D3D的MSAA,必须加上:

        pparams.MultiSampleQuality=n;

        pparams.MultiSampleType=D3DMULTISAMPLE_TYPE;

        然后初始化.

        显然SDL2的开发者没有给使用者切入这个初始化设备的手段,那么要做到通用性,我们可以设置一个回调,回传出pparams,然后再应用中自定义,即可解决.

        MSDN中指出要使用MSAA,还必须设置渲染状态,好在SDL2中给我提供了获取DirectX内部设备接口的方法:

         IDirect3DDevice9* _d3dev = SDL_RenderGetD3D9Device();//SDL 2.0.1提供

         _d3dev->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS,TRUE);

可以看到SDL2中积极的改进可以让使用者定制各种细节需求来满足深度和更灵活渲染要求.希望以后进一步开放各种参数定制的接口来满足更多的开发者需求.



你可能感兴趣的:(SDL中的Anti-aliasing)