手把手教你软渲染 #1 - 开发环境搭建
前言
什么是软渲染
软渲染,即是用软件方式模拟在 GPU 上运行的渲染流水线,就是说在 CPU 上用软件模拟本该由 GPU 承担的工作。要实现一个软渲染器,就是只用 DrawPixel 这一个硬件接口,来完成模型的整个渲染管线。
为什么要做软渲染
手动实现渲染流水线,是学习图形学最硬核的方式,能够大大提高我们对渲染管线的理解程度。
教程目标
手把手教你实现一个软渲染器,并支持 Windows 和 Mac OS 两个平台。
环境搭建
SDL2
要渲染一个模型,首先得要创建窗口,我选择开源库 SDL2,这个库不仅提供窗口相关接口,还提供绘制像素的 SDL_RenderDrawPoint 接口,即前言里所述的 DrawPixel,可谓一举两得。
以下分两个平台讲解如何下载 SDL2。
Windows
首先去官网下载:Simple DirectMedia Layer - SDL version 2.0.16 (stable) (libsdl.org)
选择 VC 版的开发库,下载后解压缩。
我们只需要用到 include 和 lib 这两个文件夹,并且我不打算支持 32 位环境,所以 lib/x86 这个文件夹下我们也不需要,我们把 x86 文件夹删掉,然后把 x64 文件夹下整个内容上移到 lib 文件夹下。
Mac OS
在 Mac 上我们安装开源库就方便多了,直接通过 homebrew 安装即可:
brew install sdl2
XMake
由于我们要做的项目是要同时支持 Win 和 Mac 两个平台的,VS 和 XCode 分别是两个平台很强大的 C/C++ IDE,但是它俩的工程文件结构并不互通,分开创建两个工程太过麻烦,所以一个好用跨平台的构建工具就很有必要了。
其实我首先想到的是大名鼎鼎的 CMake,但是在使用过程中我遇到了两个问题:
- CMake 的语法过于晦涩,学习难度大,我花了两天才搞定在 mac 上的配置;
- 同样的 CMakeLists 在 windows 上不凑效,我查阅多方资料,设置尝试了 vcpkg 也没搞定。
于是我被逼无奈,抱着死马当活马医的心态尝试了 XMake,没想到这个国产的工具竟让我眼前一亮👀
XMake 的语法是基于 Lua 的,而且接口相当统一,基本上都是以 get_ 或 set_ 开头,简单明了。与 CMake 的命令相比,那简直没有学习难度可言。
可以根据官方引导文档下载 xmake,👉传送门:Installation (xmake.io)
文件结构
在此说明一下我们的项目文件结构:
其中,src 是存放我们自己的源代码的地方,third_party 是存放第三方库的地方,third_party/SDL2-2.0.16/lib 文件夹中的文件都是 Windows 平台的 64 位发行版。
xmake.lua 就是 XMake 所用到的配置文件啦,以下是我们的项目配置:
add_rules("mode.debug", "mode.release")
add_cxxflags("-std=c++14")
-- SDL2
if is_os("windows") then
add_ldflags("/SUBSYSTEM:CONSOLE")
add_links("Shell32")
add_includedirs("third_party/SDL2-2.0.16/include")
add_linkdirs("third_party/SDL2-2.0.16/lib")
add_links("SDL2main", "SDL2")
elseif is_os("macosx") then
add_requires("brew::sdl2 2.0.16", { alias = "sdl2" })
add_packages("sdl2")
end
-- Main Renderer
target("DLSoftRenderer")
set_kind("binary")
add_includedirs("src/include")
add_files("src/*.cpp")
你也可以把 “DLSoftRenderer” 改成任何你自己的名字。
验证环境
接下来我们写一些代码测试一下 SDL2 环境是否搭建完好,在 src 下面新建 main.cpp,拷贝以下内容:
#include <iostream>
#include <SDL.h>
using namespace std;
const int WIDTH = 800, HEIGHT = 600; // SDL窗口的宽和高
int main() {
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { // 初始化SDL
cout << "SDL could not initialized with error: " << SDL_GetError() << endl;
return -1;
}
SDL_Window *window = SDL_CreateWindow(
"DL SoftRender", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
WIDTH, HEIGHT, SDL_WINDOW_ALLOW_HIGHDPI
); // 创建SDL窗口
if (window == nullptr) {
cout << "SDL could not create window with error: " << SDL_GetError() << endl;
return -1;
}
SDL_Event windowEvent; // SDL窗口事件
while (true) {
if (SDL_PollEvent(&windowEvent)) { // 对当前待处理事件进行轮询
if (SDL_QUIT == windowEvent.type) { // 如果事件为推出SDL,结束循环
cout << "SDL quit!!" << endl;
break;
}
}
}
SDL_DestroyWindow(window); // 销毁SDL窗体
SDL_Quit(); // SDL退出
return 0;
}
然后在命令行中运行:xmake & xmake run,如果出现了纯黑或纯白的窗口(win 下纯白,mac 下纯黑),说明到目前为止开发环境已经搭建好了。
生成工程文件
在 Windows 平台运行命令:
xmake project -k vsxmake -a x64
然后在项目根目录下会出现名为 vscmake2019 的文件夹(如果你安装了 VS2022,那就是 vscmake2022),其中就有 sln 文件。
在 Mac 平台运行命令:
xmake project -k xcode
然后你会在根目录下发现 xcodeproj 文件。
关于生成 IDE 工程文件的详细信息,可浏览:xmake 生成IDE工程文件
GitHub 仓库
最后附上我的 GitHub 仓库地址,这个仓库将会比教程先一步更新:
Dont-laugh/DLSoftRender: Completely implemented from scratch using C++ 14 (github.com)