SDL2以来的,相对于SDL1的一大改变就是添加了SDL_Renderer
和SDL_Texture
,这两个结构体和对应的函数。这两个结构体用于进行软件加速以便于更快更好地绘制出图形,其使用方法也比SDL_Surface
要简单(至少不用底层修改像素来绘制几何图形了)。
其实SDL_Texture
是基于SDL_Surface
的,有很多东西都很相似。SDL2较SDL1的优点就是,其SDL_Texture
是运行在GPU上的,SDL会视情况使用D3D或OpenGL,效率更高。
创建
创建SDL_Texture
有两种方法:
SDL_CreateTexture()
:直接创建一个TextureSDL_CreateTextureFromSurface()
:从一个Surface上创建一个Texture
其实第二个函数底层包含了第一个函数的调用。那么我们就先从第一个函数入手看看如何创建:
|
|
首先需要一个SDL_Renderer*
,然后需要指定format和access,format就和SDL_Surface
的format->format
成员一样(就是RGB8A888那种),access是Texture新增加的:
SDL_TEXTUREACCESS_STATIC
:很少改变的textureSDL_TEXTUREACCESS_STREAMING
:常改变的SDL_TEXTUREACCESS_TARGET
:可以被设置为render的目标的
一般都会使用第三个。 然后就是宽和高了。
这样就可以得到一个Texture了。
接下来你可以通过SDL_RenderDrawxxx
系列函数在Texture上绘制图形(要先设定为render的目标)。如果你想要从底层走的话有这个函数:
|
|
这里的rect
表示需要更新的大小(为NULL更新全部),然后是更新的像素信息pixels和一行的像素个数pitch(以字节计)。
通过上面这个函数,我们也可以将Surface的内容放到Texture上:
|
|
上面的过程其实和函数SDL_CreateTextureFromSurface()
的作用是一样的:
|
|
这样就从Surface到Texture了。
其他函数操作
关于Texture的操作都是很简单的。
获得Texture信息
首先Texture不能像Surface一样直接获得成员,所以我们有函数来获得信息:
|
|
format,access,w,h都会以参数形式返回。
设置渲染方式
如果不将渲染方式设置为Blender方式的话,透明色将不起作用:
|
|
其中blendMode:
SDL_BLENDMODE_NONE
:dstRGBA = srcRGBASDL_BLENDMODE_BLEND
:dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA));dstA = srcA + (dstA * (1-srcA))SDL_BLENDMODE_ADD
:dstRGB = (srcRGB * srcA) + dstRGB;dstA = dstASDL_BLENDMODE_MOD
:dstRGB = srcRGB * dstRGB;dstA = dstA
同样你可以通过SDL_GetRenderDrawBlendMode()
函数来获得渲染方式。
改变颜色和透明度
可以使用
|
|
来设置透明度,当Texture被渲染的时候,会执行这个公式:srcA = srcA * (alpha / 255)
。
这个函数可以来让透明度更加显眼。
同理对RGB也有:
|
|
计算公式如出一辙:srcC = srcC * (color / 255)
这个函数可以帮助你凸显RGB三分量中的一种,比如我可以将r设置为255,将g和b设置为0: