在这一系列的文章中,我想向大家展示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.flip_vertically(); // i want to have the origin at the left bottom corner of the image
image.write_tga_file("output.tga");`
return 0;
}
输出tga,应该看到像这样的结果:
预告:一些用渲染器制作的例子。
我确实希望收到反馈的邮件(dmitry.sokolov@univ-lorraine.fr);如果你有任何问题,请与我联系。如果你是一名教师,希望采用这种材料来教你的学生,从而使得你的课程很受欢迎,那么无需我主动授权,只要发邮件告诉我即可。这会帮助我改进教程。
编译自:https://github.com/ssloy/tinyrenderer/wiki
作者: Dmitry V. Sokolov 译者:Daisy 校对:Wendy