问题描述
我想模拟旧的CRT扫描线,但是我找不到一种方法可以只创建一次扫描线层,以避免浪费每个主循环周期的cpu时间。
基本上,在我的游戏中,我在主循环周期中有这段代码:
createTExture();
SDL_RenderClear(windoWrenderer);
SDL_Rendercopy(windoWrenderer,gameFrameTexture,&sourceRectangle,&destinationRectangle);
// Scanlines
if (scanlines)
{
for (i = 0; i < destinationRectangle.h; i += 3)
{
SDL_RenderDrawLine(windoWrenderer,destinationRectangle.x,destinationRectangle.y + i,destinationRectangle.x + destinationRectangle.w,destinationRectangle.y + i);
}
}
SDL_RenderPresent(windoWrenderer);
使用for
的{{1}}周期为每3条线创建一条扫描线,并且输出非常好,但是...在cpu性能低的硬件上它很慢。
因此,我尝试将SDL_RenderDrawLine()
与2种纹理和透明度SDL_Setrendertarget()
和gameFrameTexture
一起使用,直接在纹理上创建扫描线,并使用scanlinesTexture
两种渲染框架时间以正确的顺序。但是通过这种方式,当SDL_Rendercopy()
在SDL_Rendercopy()
和sourceRectangle
之间执行复制时,扫描线会被拉伸(因为纹理没有游戏窗口的尺寸),因此输出很大时非常难看(就高度而言)扫描线。
是否可以在默认渲染器的窗口上仅一次创建扫描线?
解决方案
正如我之前尝试的那样,正确的方法是使用2种纹理,一种用于扫描线,另一种用于游戏框架。 但是...扫描线纹理必须具有最终分辨率(窗口或全屏),以避免拉伸。
重要的是用destinationRectangle
为纹理设置SDL_BLENDMODE_BLEND
,并用alpha(透明度)值设置SDL_SetTextureBlendMode()
。这样,所有绘制操作都将使用这种颜色(即扫描线将变为黑色,透明度很少)
解决方法
但是以这种方式延长了扫描线...(因为纹理没有游戏窗口的尺寸)
在知道分辨率后立即动态创建纹理,然后将其应用到建议的解决方案中(两次复制到渲染目标,但有些不透明)。