如何在 sdl2 中升级 window 或渲染器以获得像素化外观?

How to Upscale window or renderer in sdl2 for pixelated look?

我想要this屏幕上所有对象的 sdl2 像素化外观

为此,必须设置 nearest 缩放比例(SDL2 中的默认设置),它不使用抗锯齿。如果是这样,您可以通过将提示 SDL_HINT_RENDER_SCALE_QUALITY 设置为 nearest(或 0)来使用 SDL_SetHint。如果您现在在足够大的区域(比纹理尺寸大得多)中渲染小纹理,您将在 window.

中看到大像素

如果,另一方面,你有大纹理(就像在链接线程中一样),或者你只想渲染整个帧像素化,你可以通过在 low-resolution辅助贴图(作为后台缓冲区),渲染整帧后,在window渲染后台缓冲区。缓冲区纹理将在整个 window 上拉伸,然后像素化将可见。

我将此方法用于 Fairtris 游戏,该游戏以 NES-like 分辨率渲染图像。内部后台缓冲区纹理的分辨率为 256×240 像素,并以任意大小的 window 呈现,并保持所需的比例(4:3,因此水平略微拉伸)。但是,在这个游戏中我使用了线性缩放来使图像更平滑。


为此您需要:

  • 记住必须设置 nearest 缩放比例,
  • 使用 SDL_RENDERER_TARGETTEXTURE 标志创建渲染器,
  • 创建具有低分辨率(例如 256×240)和 SDL_TEXTUREACCESS_TARGET 标志的后台缓冲区纹理。

渲染帧时,您需要:

  • 使用 SDL_SetRenderTarget
  • 将渲染器目标设置为后缓冲纹理
  • 使用渲染器和后台缓冲区大小(例如 256×240)渲染帧应包含的所有内容,
  • 再次使用 SDL_SetRenderTarget 将渲染器目标返回到 window。

如果您想要更小的区域(放大效果,屏幕上的像素更大)或更大的区域(缩小效果,屏幕上的像素更小),您可以随时调整后台缓冲区纹理的大小框架。为此,您很可能必须销毁并重新创建具有不同大小的后台缓冲区纹理。或者,您可以创建一个带有额外边距的大后缓冲纹理,并在渲染时使用更小或更大的区域——这将避免冗余内存操作。

此时,整个帧都位于可以在 window 中渲染的辅助纹理中。要在 window 中渲染它,请使用 SDL_RenderCopy 函数,指定渲染器句柄和后台缓冲区纹理句柄(不应给出矩形,以便纹理将在整个 window 区),最后 SDL_RenderPresent.

如果您需要在 window 帧中根据纵横比进行渲染,请使用 SDL_GetWindowSize 获取当前 window 大小,并根据纵横比计算目标区域后台缓冲区纹理和 window 比例(纵向和横向)。但是,在 window 中渲染后台缓冲区纹理之前,首先使用 SDL_RenderClear 清理 window,以便 window 的剩余区域(黑条)填充黑色.