Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 464|回复: 0

【学习】SDL中的Anti-aliasing

[复制链接]

535

主题

552

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
19009
发表于 2020-4-2 23:31:07 | 显示全部楼层 |阅读模式
 默认情况下,SDL2中默认是不启用MSAA.为了能启用,必须做些设置.如果渲染器工作在OpenGL/ES模式下,那么直接使用:
[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
   SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,1);

 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,n);
即可,如果再windows下,渲染器会自动选择D3D作为渲染接口,那么我们要强行把渲染设备切换到OpenGL模式:
[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
 SDL_SetHint(SDL_HINT_RENDER_DRIVER,"opengl");
但是在DirectX中如何设置MSAA呢,查看SDL2源码发现:
[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
D3DPRESENT_PARAMETERS pparams;

         ... ...

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

                                     D3DDEVTYPE_HAL,

                                     pparams.hDeviceWindow,

                                     device_flags,

                                     &pparams, &data->device);
这是SDL2初始化D3D设备的一段代码,根据MSDN,设置D3D的MSAA,必须加上:
[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
 pparams.MultiSampleQuality=n;

[align=left][color=rgb(51, 51, 51)][font=-apple-system, BlinkMacSystemFont, &quot][size=16px]pparams.MultiSampleType=D3DMULTISAMPLE_TYPE;
      
然后初始化.
显然SDL2的开发者没有给使用者切入这个初始化设备的手段,那么要做到通用性,我们可以设置一个回调,回传出pparams,然后再应用中自定义,即可解决.
MSDN中指出要使用MSAA,还必须设置渲染状态,好在SDL2中给我提供了获取DirectX内部设备接口的方法:
[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
 IDirect3DDevice9* _d3dev = SDL_RenderGetD3D9Device();//SDL 2.0.1提供

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|246SA 石器论坛

GMT+8, 2020-8-15 19:14 , Processed in 1.109137 second(s), 13 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表