在上一节我们已经在C++的编译环境下通过SDL库创建了窗口,并且能够通过用了两种不同的方式去控制我们的窗口,但并没有任何画面,此次我们将在窗口上通过SDL_Renderer()函数在我们的窗口上去渲染画面。
此处可查看上一节我们如何创建的窗口
1.首先我们需要理解什么是渲染
渲染在电脑绘图中是指用软件从模型生成图像的过程。模型是用严格定义的语言或者数据结构对于三维物体的描述,它包括几何、视点、纹理以及照明信息。
将三维场景中的模型,按照设定好的环境、灯光、材质及渲染参数。二维投影成数字图像的过程。
简单来说渲染就是从计算机里将数据生成为图像的过程。本文讲的是2D渲染,也就是平面渲染,还并没有涉及到3D渲染,所以等到我们深入到3D渲染时,我们会对渲染器有一个更好的理解。
2.创造渲染对象
SDL_Renderer*render = SDL_CreateRenderer(
mWindow, // 这是一个窗口对象,渲染器将与这个窗口关联,所有的绘制操作都会在这个窗口内进行。
-1, // 这个参数指定了视频驱动程序使用的渲染设备。如果为 `-1`,则由 `SDL` 自动选择最佳的渲染设备。如果指定一个非负整数,则表示具体的渲染设备索引。
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC 这俩个是标志位
);
if (!render)
{
SDL_Log("Failed to create renderer: %s", SDL_GetError());
return false;
}
以下是`SDL_RendererFlags`的一些常用标志位:
1.SDL_RENDERER_SOFTWARE--指定使用软件渲染器。
2.SDL_RENDERER_ACCELERATED--选择硬件加速的渲染器。
3.DL_RENDERER_PRESENTVSYNC--同步到垂直刷新率,以避免屏幕撕裂。
4.SDL_RENDERER_TARGETTEXTURE--创建一个离屏渲染器,该渲染器首先渲染到纹理上,然后通过 `SDL_SetRenderTarget()` 来呈现到屏幕上。(纹理是由 「纹素(texel)」 构成的,每个纹素记录着相应的颜色信息,它类似于屏幕的 「像素(pixel)」 )
5.SDL_RENDERER_NOFLIP--强制不进行任何 Y 轴翻转。
6.SDL_RENDERER_LOGICAL_SIZE fixed-point--指定一个固定的逻辑尺寸,即使窗口大小变化,逻辑尺寸也不会改变。这有助于保持游戏或应用的一致性。
这些标志可能随着 SDL 库的不同版本有所变动。因此,在使用时建议查阅最新版的官方文档来获取最新的信息和特性支持情况。你可以参考 [SDL 官方文档](https://wiki.libsdl.org/SDL_CreateRenderer) 获取最准确的信息。
3.将想要渲染的内容添加到窗口
bool running = true;
SDL_Event e;
while (running) {
//监听用户事件,如果我们点右上角的叉,就退出窗口。
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
running = false;
}
}
// 设置渲染器的背景颜色
SDL_SetRenderDrawColor(mRenderer, //渲染对应的窗口
//每个值的取值范围为(0,255)
225, //红色
225, //绿色
225, //蓝色
255); //透明度
//清空窗口呈现出来的纹理
SDL_RenderClear(mRenderer);
// 呈现内容
SDL_RenderPresent(mRenderer);
}
在SDL中,渲染通常分为两个部分,绘制和呈现。
SDL使用的是双缓冲区模式,绘制操作通常是在后缓冲区中进行的,这样可以避免绘制过程中的画面闪烁,SDL_SetRenderDrawColor()函数绘制背景就是在后缓冲区进行的。这里我们设置的背景颜色为纯白色,如果不设置,渲染器默认是黑色的。
SDL_RenderClear()函数只清理前缓冲区的内容,也就是呈现在屏幕上的内容。
当所有绘制操作完成后,需要将后缓冲区的内容显示到前缓冲区(front buffer),也就是屏幕上,这时,我们就需要SDL_RenderPresent()函数,将后缓冲区的内容复制到前缓冲区,并显示在屏幕上。这个函数会立即刷新屏幕,使用户能够看到新绘制的内容。
4.渲染后的画面
此时,我们的画面背景就渲染成功了。
5.总代码
#include <SDL\SDL.h>
#include<stdio.h>
int main(int argc, char* argv[]) {
// 初始化 SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
return -1;
}
// 创建窗口
SDL_Window* window = SDL_CreateWindow("Square Drawing Example",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
800, 600,
SDL_WINDOW_SHOWN);
if (!window) {
printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
SDL_Quit();
return -1;
}
// 创建渲染器
SDL_Renderer* render = SDL_CreateRenderer(
window, // 这是一个窗口对象,渲染器将与这个窗口关联,所有的绘制操作都会在这个窗口内进行。
-1, // 这个参数指定了视频驱动程序使用的渲染设备。如果为 `-1`,则由 `SDL` 自动选择最佳的渲染设备。如果指定一个非负整数,则表示具体的渲染设备索引。
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC //这俩个是标志位
);
if (!render)
{
SDL_Log("Failed to create renderer: %s", SDL_GetError());
return false;
}
bool running = true;
SDL_Event e;
while (running) {
//监听用户事件,如果我们点右上角的叉,就退出窗口。
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
running = false;
}
}
// 设置渲染器的背景颜色
SDL_SetRenderDrawColor(render, //渲染对应的窗口
//每个值的取值范围为(0,255)
225, //红色
225, //绿色
225, //蓝色
255); //透明度
//清空窗口呈现出来的纹理
SDL_RenderClear(render);
// 呈现内容
SDL_RenderPresent(render);
}
// 清理资源
SDL_DestroyRenderer(render);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
这里我们就相当于把窗口渲染的初始化给做好了,也就是窗口呈现画面的第一步,而紧接着我们会在我们的窗口上添加我们想要表达的内容。