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

在这一系列的文章中,我想向大家展示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

 

 

 

 

 

 

时间: 2024-08-24 00:21:32

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

仅用500行Python代码实现一个英文解析器的教程_python

语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理.自然语言引入了很多意外的歧义,以我们对世界的了解可以迅速地发现这些歧义.举一个我很喜欢的例子: 正确的解析是连接"with"和"pizza",而错误的解析将"with"和"eat"联系在了一起: 过去的一些年,自然语言处理(NLP)社区在语法分析方面取得了很大的进展.现在,小小的 Python 实现可能比广泛应用的 Stanford 解析器表现得更出色. 文章剩下

【飞天stack】专访阿里李津:阿里云的第一行代码及专有云Apsara Stack的核心优势

随着计算日益成为水电煤一样的公共服务,越来越多的政府.大型企业以更加开放的姿态拥抱云计算.同时出于自身数据中心利旧和数据本地化的考虑,大量政企客户需要专属的云计算解决方案.4月20日,在云栖大会·深圳峰会上,阿里云发布专有云Apsara Stack,可为政企客户实现在自有的数据中心内构建完整的专属式云计算服务,为客户打造安全.可靠.弹性的云计算工作环境.  云栖大会·武汉峰会现场 而在云栖大会走到武汉之际,笔者在现场感受到阿里云的火热以及技术魅力,其中亮点之一的是阿里云资深产品总监李津就专有云的

12行代码的浏览器DoS攻击分析及防御

有一段12行的JavaScript代码,可以让firefox.chrome.safari浏览器崩溃,而且还能让iphone重启.安卓闪退,本文作者对于该12行代码进行了分析解读并且提出了相应的防御办法,欢迎大家一同探讨. ajax与pjax AJAX(阿贾克斯),这里说的可不是阿贾克斯俱乐部哦! AJAX(阿贾克斯)即"Asynchronous Javascript And XML"(异步JavaScript和XML),是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交

不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)

生成对抗网络(Generative Adversarial Networks,GAN)最早由 Ian Goodfellow 在 2014 年提出,是目前深度学习领域最具潜力的研究成果之一.它的核心思想是:同时训练两个相互协作.同时又相互竞争的深度神经网络(一个称为生成器 Generator,另一个称为判别器 Discriminator)来处理无监督学习的相关问题.在训练过程中,两个网络最终都要学习如何处理任务. 通常,我们会用下面这个例子来说明 GAN 的原理:将警察视为判别器,制造假币的犯罪分

nodejs 几行代码实现静态资源服务器

通过node js几行代码即可实现静态资源处理服务器. var connect = require("connect"); var serveStatic = require("serve-static"); var app = connect(); app.use(serveStatic("/home/用户名/file"),{ maxAge: '30d' }); app.listen(5000); //监听5000端口 通过ab压测对比 tom

求从1到500的整数中能被3和5整除但不能被7整除的数的个数

     设为1到500的整数中能被i整除的数的集合,, 则,,, ,,, ,      满足条件的整数个数为:,根据容斥原理有:         我知道是容斥原理,关键是不知道最后一个公式,用两个集合想想韦氏图就行了.

几行代码搞定一棵漂亮的树

程序名:JTree(树状控件)结合了XML的长处,使您只需几行代码就可以拥有像Windows的资源管理器一样的Treeview了. 之前,本人曾写过一个Treeview,但是,不够美观,这一版本,在外观上做了很大的改进,很漂亮.运行速度很快. 详细功能请见示例示例打包下载 JTree在onclick时,有两个值可以用: var myTree=new JTree("showTree","vogueType.xml");myTree.setPicPath("i

几行代码轻松搞定网页的简繁转换

简繁转换|网页 对网页进行简繁字体转换的方法一般有两种:一是使用<简繁通>这样的专业软件,另外一种是制作两套版本的网页.显然,这两种方法都较为麻烦,而且专业软件一般不能用于免费的空间.笔者在这里给大家提供一个非常简单的方法,只须在页面上添加几行代码就可以轻松搞定网页的简繁转换了.首先在http://www.knowsky.com/download/transform.js处下载用于简繁转换的js文件transform.js,复制到网站目录下,然后使用网页制作工具打开需要进行简繁转换的网页,

3行代码的分页算法(求起始页和结束页)

  涉及到分页时, 除非只显示上一页/下一页, 否则需要计算起始页和结束页. 看过很多代码都是用大量的if-else来实现, 代码量大, 又不简洁. 现在提供一种只需要3行代码的算法. 一个好的分页算法, 应该具有下面的优点: 当前页码应该尽量在正中间. 如果"首页"和"尾页"不可用(当前处于第一页或最后一页), 不要隐藏这两组文字, 以免链接按钮位置变动. 算法简单. 下面的算法具有前面1和3两个优点. PHP: // $curr_index, 当前页码. //