OpenGL是如何运转的:在500行代码中的软件渲染器

在这一系列的文章中,我想向大家展示OpenGL通过编写其克隆来运作的方式(一种简化了很多的方式)。令人吃惊的是,我经常遇见一些在学习OpenGL/ DirectX的过程中连基础障碍都无法克服的人。因此,我已经准备了一系列较短的演讲,演讲结束后,我的学生会展示一些非常好的渲染器。

 

所以,任务被制定为以下:使用非第三方的函数库(尤其是图表类的),获得像这张图表一样的东西。

 

083e3f1038cfd50464082dc43e4c413e9e3413ad

 

警告:这是一种可以轻率地复制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,应该看到像这样的结果:

3f731190c1a36ec4c96cb1e0fa97960541715557

 

预告:一些用渲染器制作的例子。

97ba256d09d20fcc8925702ec1c89011252e8fe1

 

a069d44115eb83676d0d6170e2507abb0500511c

 

c1deeaea65dab08fd8726d69450f7757d0730ec8

 

d6d9d6b9b20f2f33ac3826f9b12f89d1f57f7ae3

 

我确实希望收到反馈的邮件(dmitry.sokolov@univ-lorraine.fr);如果你有任何问题,请与我联系。如果你是一名教师,希望采用这种材料来教你的学生,从而使得你的课程很受欢迎,那么无需我主动授权,只要发邮件告诉我即可。这会帮助我改进教程。


编译自:https://github.com/ssloy/tinyrenderer/wiki

作者: Dmitry V. Sokolov  译者:Daisy  校对:Wendy

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值