目录
内容介绍
这一系列文章主要是在翻译github上的tinyrenderer教程。想要学习tinyrenderer,需要先去学习games101的第一部分渲染相关的内容,同时我也会以初学者的角度尽可能易懂的去讲解tinyrenderer各个功能的实现,若有讲的不好的地方还请各位指正。
lesson 0:
这篇文章主要用于模仿OpenGL的工作流程(简化),非常吃惊的是,有很多人被OpenGL/DirectX的入门学习困扰。因此,我已经准备一系列简短的课程,我的学生在学习之后做出了相当不错的渲染器。
所以,我们要做的是:不使用第三方库,得到一些如下的图片:
警告:这篇文章只用于说明OpenGL的工作流程,而不会去教你怎么使用OpenGL。
我将会尝试使用大概500行去编写这个编译器。但我的学生们将需要10到20个小时做出同样的效果。在输入信息中,我们会使用一个文件,它由多边形的线(相当于给很多个顶点坐标之类的信息,指定哪几个顶点连线的信息,之后会详细说明)+纹理贴图组成。在输出中,我们将会得到一个被渲染过的图片。由于没有使用图形接口,这个程序只是简单的输出一个图片。
TGA文件
为了尽可能减少对外界库的依赖,我仅仅给出一个生成TGA文件(按我的理解相当于一张图片)的类。TAG格式是最简单的格式,能够生成RGB/RGBA/黑白格式的图像。所以,作为开始,我们将会使用一个简单的方法去生成这个图片。您应该注意,我们将使用的是唯一提供给我们的函数(除了加载模型,保存图片的函数以外唯一提供的函数):能够在像素上设置一种颜色。
我不会提供绘制线段或填充三角形的函数,我们将会一起实现这些功能。
生成TGA文件的简单示例
#include "tgaimage.h"
// 设置RGBA的值
const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red = TGAColor(255, 0, 0, 255);
int main(int argc, char** argv) {
// 开启画框,大小为100(像素)*100(像素)
TGAImage image(100, 100, TGAImage::RGB);
//绘制像素处于x=52,y=41处的像素,颜色为red
image.set(52, 41, red);
//将图片中的顶点翻转,变成以左下角为中心
//image以左上角为原点,经过这个函数以后图片会进行上下翻转,相当于以左下角为原点
image.flip_vertically(); // i want to have the origin at the left bottom corner of the image
//生成output.tga文件
image.write_tga_file("output.tga");
return 0;
}
(图中红色的像素点)