手把手教你软渲染 #1 - 开发环境搭建

1,828 阅读4分钟

手把手教你软渲染 #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 版的开发库,下载后解压缩。

SDL2

我们只需要用到 includelib 这两个文件夹,并且我不打算支持 32 位环境,所以 lib/x86 这个文件夹下我们也不需要,我们把 x86 文件夹删掉,然后把 x64 文件夹下整个内容上移到 lib 文件夹下。

Mac OS

在 Mac 上我们安装开源库就方便多了,直接通过 homebrew 安装即可:

brew install sdl2

XMake

由于我们要做的项目是要同时支持 Win 和 Mac 两个平台的,VS 和 XCode 分别是两个平台很强大的 C/C++ IDE,但是它俩的工程文件结构并不互通,分开创建两个工程太过麻烦,所以一个好用跨平台的构建工具就很有必要了。

其实我首先想到的是大名鼎鼎的 CMake,但是在使用过程中我遇到了两个问题:

  1. CMake 的语法过于晦涩,学习难度大,我花了两天才搞定在 mac 上的配置;
  2. 同样的 CMakeLists 在 windows 上不凑效,我查阅多方资料,设置尝试了 vcpkg 也没搞定。

于是我被逼无奈,抱着死马当活马医的心态尝试了 XMake,没想到这个国产的工具竟让我眼前一亮👀

XMake 的语法是基于 Lua 的,而且接口相当统一,基本上都是以 get_set_ 开头,简单明了。与 CMake 的命令相比,那简直没有学习难度可言。

可以根据官方引导文档下载 xmake,👉传送门:Installation (xmake.io)

文件结构

在此说明一下我们的项目文件结构:

file_struct

其中,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)