git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
渲染的图像保存到framebuffer.tga
。
您可以在 Gitpod(GitHub 的免费在线开发环境)中打开该项目:
打开时,编辑器将编译并运行程序,并在编辑器的预览中打开生成的图像。只需更改编辑器中的代码并重新运行脚本(使用终端的历史记录)即可查看更新的图像。
我的源代码无关紧要。阅读 wiki 并实现您自己的渲染器。只有当你经历了所有的微小细节时,你才会知道发生了什么。
在本系列文章中,我想通过编写 OpenGL 的克隆(一个非常简化的克隆)来展示 OpenGL 的工作原理。令人惊讶的是,我经常遇到无法克服学习 OpenGL / DirectX 初始障碍的人。因此,我准备了一系列简短的讲座,之后我的学生展示了相当出色的渲染器。
因此,任务的表述如下:不使用第三方库(尤其是图形库),得到如下图所示的内容:
警告:这是一份培训材料,将松散地重复 OpenGL 库的结构。它将是一个软件渲染器。我不想展示如何编写 OpenGL 应用程序。我想展示 OpenGL 是如何工作的。我深信,如果不理解这一点,就不可能使用 3D 库编写高效的应用程序。
我会尽量让最终的代码在500行左右。我的学生需要 10 到 20 个小时的编程时间才能开始制作这样的渲染器。在输入处,我们得到一个带有多边形线+带有纹理的图片的测试文件。在输出中,我们将得到一个渲染的模型——没有图形界面,程序只是生成一个图像。
由于目标是最大程度地减少外部依赖性,因此我只为学生提供一门允许使用 TGA 文件的课程。它是支持 RGB/RGBA/黑白格式图像的最简单格式之一。因此,作为起点,我们将获得一种处理图片的简单方法。您应该注意,一开始可用的唯一功能(除了加载和保存图像之外)是设置一个像素的颜色的能力。
没有用于绘制线段和三角形的函数。我们必须手工完成所有这些工作。我提供我与学生并行编写的源代码。但我不建议使用它,因为这没有意义。完整的代码可以在 GitHub 上找到,在这里你可以找到我给我的学生的源代码。
# include " tgaimage.h "
const TGAColor white = TGAColor( 255 , 255 , 255 , 255 );
const TGAColor red = TGAColor( 255 , 0 , 0 , 255 );
int main ( int argc, char ** argv) {
TGAImage image ( 100 , 100 , TGAImage::RGB);
image. set ( 52 , 41 , red);
image. write_tga_file ( " output.tga " );`
return 0 ;
}
output.tga 应该看起来像这样: