如何在 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 的剩余区域(黑条)填充黑色.
我想要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 的剩余区域(黑条)填充黑色.